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

# PrimerCardNetwork

> Card network type used for co-badged card selection

<Warning>
  Primer Checkout iOS SDK is currently in **beta** (v3.0.0-beta.1).
  The API is subject to change before the stable release.
</Warning>

`PrimerCardNetwork` represents a single card network (card scheme) detected from a card number, together with the display information needed to render it. It is the model used in **co-badged card** scenarios — when one physical card carries more than one network (for example Cartes Bancaires + Visa) and the shopper, or your UI, must choose which network to route the payment through.

You read `PrimerCardNetwork` values from [`PrimerCardFormState`](/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/card-form-session) (`availableNetworks` and `selectedNetwork`) and commit a choice with [`PrimerCardFormSession.selectCardNetwork(_:)`](/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/card-form-session).

## Definition

```swift theme={"dark"}
@objc
public final class PrimerCardNetwork: NSObject
```

<Info>
  You never construct `PrimerCardNetwork` yourself. The SDK detects networks from the entered card number and publishes them on `PrimerCardFormState.availableNetworks`. Use those instances directly when calling `selectCardNetwork(_:)`.
</Info>

## Properties

| Property                     | Type          | Description                                                                                                                  |
| ---------------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `displayName`                | `String`      | Human-readable network name for display (e.g. `"Visa"`, `"Mastercard"`, `"Cartes Bancaires"`).                               |
| `network`                    | `CardNetwork` | The underlying card network value. See [CardNetwork](#cardnetwork).                                                          |
| `allowed`                    | `Bool`        | `true` when this network is enabled for the current merchant configuration.                                                  |
| `allowsUserSelection`        | `Bool`        | `true` when the shopper may choose this network in a co-badged selector. `false` for networks that auto-route (e.g. EFTPOS). |
| `issuerCountryCode`          | `String?`     | ISO country code of the card issuer, when known.                                                                             |
| `issuerName`                 | `String?`     | Name of the card issuer, when known.                                                                                         |
| `accountFundingType`         | `String?`     | Account funding type (e.g. credit/debit), when known.                                                                        |
| `prepaidReloadableIndicator` | `String?`     | Indicator describing whether a prepaid card is reloadable, when known.                                                       |
| `productUsageType`           | `String?`     | Product usage type reported by the network, when known.                                                                      |
| `productCode`                | `String?`     | Network product code, when known.                                                                                            |
| `productName`                | `String?`     | Network product name, when known.                                                                                            |
| `issuerCurrencyCode`         | `String?`     | ISO currency code associated with the issuer, when known.                                                                    |
| `regionalRestriction`        | `String?`     | Regional restriction reported by the network, when known.                                                                    |
| `accountNumberType`          | `String?`     | Account number type reported by the network, when known.                                                                     |

<Note>
  `displayName`, `network`, `allowed`, and `allowsUserSelection` are the properties you need for co-badge selection. The remaining `String?` properties carry optional issuer/BIN metadata that is populated only when the SDK resolves it remotely; treat them as supplementary display data.
</Note>

## CardNetwork

`network` is a `CardNetwork` — a `String`-backed enum identifying the scheme. Its raw value matches the network's canonical uppercase identifier.

```swift theme={"dark"}
public enum CardNetwork: String, Codable, CaseIterable
```

<Note>
  The source declaration also conforms to an internal logging protocol that is not part of the public contract; it is omitted here.
</Note>

| Case               | Raw value          | Display name     |
| ------------------ | ------------------ | ---------------- |
| `.amex`            | `AMEX`             | American Express |
| `.bancontact`      | `BANCONTACT`       | Bancontact       |
| `.cartesBancaires` | `CARTES_BANCAIRES` | Cartes Bancaires |
| `.diners`          | `DINERS_CLUB`      | Diners           |
| `.discover`        | `DISCOVER`         | Discover         |
| `.eftpos`          | `EFTPOS`           | EFTPOS           |
| `.elo`             | `ELO`              | Elo              |
| `.hiper`           | `HIPER`            | Hiper            |
| `.hipercard`       | `HIPERCARD`        | Hiper            |
| `.jcb`             | `JCB`              | JCB              |
| `.maestro`         | `MAESTRO`          | Maestro          |
| `.masterCard`      | `MASTERCARD`       | Mastercard       |
| `.mir`             | `MIR`              | Mir              |
| `.visa`            | `VISA`             | Visa             |
| `.unionpay`        | `UNIONPAY`         | UnionPay         |
| `.unknown`         | `OTHER`            | Unknown          |

The enum exposes these public members:

| Member                         | Type                       | Description                                                              |
| ------------------------------ | -------------------------- | ------------------------------------------------------------------------ |
| `displayName`                  | `String`                   | Human-readable network name.                                             |
| `icon`                         | `UIImage?`                 | Branded network icon, or `nil` when none is bundled.                     |
| `traits`                       | `PrimerCardNetworkTraits?` | PAN length, gap pattern, and CVV metadata for the network, or `nil`.     |
| `init(cardNumber: String)`     | —                          | Detects the network from a card number, falling back to `.unknown`.      |
| `init(cardNetworkStr: String)` | —                          | Resolves a network from a string identifier, falling back to `.unknown`. |

## Co-badged card selection

When the entered card number resolves to more than one network, the card form publishes those options on `PrimerCardFormState`. Read them inside any [`PrimerCardForm`](/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/primer-card-form) slot through the injected [`PrimerCardFormSession`](/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/card-form-session):

| State property      | Type                  | Description                                                                       |
| ------------------- | --------------------- | --------------------------------------------------------------------------------- |
| `availableNetworks` | `[PrimerCardNetwork]` | Networks detected from the card number. More than one indicates a co-badged card. |
| `selectedNetwork`   | `PrimerCardNetwork?`  | The currently selected network, or `nil` while the network is auto-detected.      |

To commit a choice, pass one of the `availableNetworks` instances to the session:

| Method                                            | Description                                                                                                      |
| ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `selectCardNetwork(_ network: PrimerCardNetwork)` | Selects a network for a co-badged card. Applicable only when `availableNetworks` contains more than one network. |

<Tip>
  Show a selector only when there is a real choice to make — gate it on `availableNetworks.count > 1`. For a single detected network the SDK routes automatically and no selection is needed.
</Tip>

### Building a custom selector

```swift theme={"dark"}
import SwiftUI
import PrimerSDK

@available(iOS 15.0, *)
struct CoBadgedNetworkPicker: View {
    @ObservedObject var session: PrimerCardFormSession

    var body: some View {
        let networks = session.state.availableNetworks
        if networks.count > 1 {
            VStack(alignment: .leading, spacing: 8) {
                Text("Choose card network")
                    .font(.subheadline)

                ForEach(networks, id: \.network) { network in
                    Button {
                        session.selectCardNetwork(network)
                    } label: {
                        HStack {
                            Text(network.displayName)
                            Spacer()
                            if session.state.selectedNetwork?.network == network.network {
                                Image(systemName: "checkmark")
                            }
                        }
                    }
                    .disabled(!network.allowed)
                }
            }
        }
    }
}
```

<Note>
  Render only networks where `allowsUserSelection` is `true` (and that are `allowed`). Networks that auto-route — such as EFTPOS — are resolved by the SDK and should not appear as a manual choice.
</Note>

### Using the built-in selector

If you don't need a fully custom picker, the SDK ships a ready-made dropdown. The default `cardDetails` section renders it automatically once a co-badged card is detected. When you recompose the individual card fields yourself, add the standalone selector with `CardFormDefaults.cardNetwork(_:)` — it already gates on `availableNetworks.count > 1` and calls `selectCardNetwork(_:)` for you. See [Card field components](/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/card-field-components).

```swift theme={"dark"}
PrimerCardForm(cardDetails: { session in
    VStack(alignment: .leading, spacing: 16) {
        CardFormDefaults.cardNumber(session)
        CardFormDefaults.cardNetwork(session)
    }
})
```

## See also

<CardGroup cols={2}>
  <Card title="Card Form Session" icon="signal-stream" href="/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/card-form-session">
    State, network selection, and submission for the card form.
  </Card>

  <Card title="Card field components" icon="puzzle-piece" href="/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/card-field-components">
    The built-in co-badge selector and other per-field building blocks.
  </Card>

  <Card title="PrimerCardForm" icon="credit-card" href="/docs/sdk/ios-checkout/v3.0.0-beta/api/card-form/primer-card-form">
    The card form view and its slots.
  </Card>
</CardGroup>
