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

# Quickstart

> Launch your first Zentra integration from primitives, then opt into add-ons only when needed.

This guide walks through the fastest safe path to a Zentra integration: create your developer account, generate keys, initialize the SDK, resolve an account, and create a test transfer with a stable reference and minor-unit amount.

***

<Note>
  **Prerequisites**:

  * A [Zentra Developer Console](https://api.usezentra.com/developer/signup) account.
  * Basic knowledge of REST APIs.
</Note>

<Info>
  Start with reviewed public namespaces first: transfers and webhooks. Add payments, identity, cards, virtual accounts, or billpay only when your product actually needs those rails and your tenant is enabled for them.
</Info>

<Steps>
  <Step title="Get your API keys">
    Sign in to the [Developer Console](https://api.usezentra.com/developer/signin?callbackUrl=%2Fdeveloper%2Fapi-keys) and open **API Keys**.

    You will see two types of keys:

    * **Sandbox keys** (`sk_sandbox_...`): Use these for development and testing.
    * **Live keys** (`sk_live_...`): Use these for production only after your account is approved for live traffic.

    <Warning>
      Keep your **Secret Key** (`sk_...`) secure. Never commit it to GitHub or client-side code.
    </Warning>
  </Step>

  <Step title="Install the SDK">
    We recommend using an official SDK for typed requests and consistent auth handling.

    <CodeGroup>
      ```bash npm theme={null}
      npm install @zentra/sdk
      ```

      ```bash pip theme={null}
      pip install zentra-python
      ```

      ```bash composer theme={null}
      composer require zentra/sdk-php
      ```
    </CodeGroup>
  </Step>

  <Step title="Initialize the client">
    Import the library and initialize it with your secret key.

    <CodeGroup>
      ```javascript lib/zentra.ts theme={null}
      import { Zentra } from "@zentra/sdk";

      export const zentra = new Zentra({
        apiKey: process.env.ZENTRA_SECRET_KEY,
        environment: "sandbox"
      });
      ```

      ```python src/client.py theme={null}
      import os
      from zentra import Zentra

      client = Zentra(
          api_key=os.environ.get("ZENTRA_SECRET_KEY"),
          environment="sandbox",
      )
      ```
    </CodeGroup>
  </Step>

  <Step title="List banks and create a test transfer">
    Start with a reviewed primitive flow. Fetch the reviewed bank directory, then create a transfer using minor units and a stable business reference.

    <CodeGroup>
      ```javascript app.ts theme={null}
      const banks = await zentra.transfers.getBanks();
      console.log(`Loaded ${banks.length} banks`);

      const transfer = await zentra.transfers.create({
        amountMinor: 50000,
        destinationBankCode: "058",
        destinationAccountNumber: "0123456789",
        destinationAccountName: "Sandbox Beneficiary",
        narration: "Zentra quickstart payout",
        reference: "QS_TRF_001"
      });

      console.log(`Transfer created: ${transfer.reference}`);
      ```

      ```python app.py theme={null}
      banks = client.transfers.get_banks()
      print(f"Loaded {len(banks)} banks")

      transfer = client.transfers.create(
          amount_minor=50000,
          destination_bank_code="058",
          destination_account_number="0123456789",
          destination_account_name="Sandbox Beneficiary",
          narration="Zentra quickstart payout",
          reference="QS_TRF_001",
      )

      print(f"Transfer created: {transfer['reference']}")
      ```
    </CodeGroup>
  </Step>
</Steps>

## Optional Rail Add-Ons

When your product needs more than primitive transfers:

* enable **payments** for customer-present charges, refunds, and saved payment tokens
* enable **virtual accounts** for inbound collections
* enable **cards** for issuing and spend controls
* enable **identity** when your tenant needs the reviewed identity namespace
* enable **billpay** when your tenant uses that optional rail

## Next Steps

Now that your first primitive flow works, choose the next capability you actually need:

<CardGroup cols={3}>
  <Card title="Transfers" href="/api-reference/transfers/overview">
    Move money using the reviewed primitive transfer contract.
  </Card>

  <Card title="Webhooks" href="/guides/handling-webhooks">
    Verify signatures, process events idempotently, and keep your state in sync.
  </Card>

  <Card title="Reviewed surface policy" href="/resources/reviewed-public-surface">
    Check which namespaces are reviewed public, tenant-gated, or still draft.
  </Card>
</CardGroup>
