# Quickstart

{% hint style="info" %}
You will need an API key to follow along. If you do not have one yet, contact the Zynta team or create one via the [Dashboard](/dashboard/dashboard-overview.md).
{% endhint %}

### Step 1: Create a recipient

Create an individual recipient with KYC information. Zynta will verify their identity and generate a custodial wallet automatically.

```bash
curl -X POST https://zynta-lastmile-api.up.railway.app/api/v1/recipients/individual \
  -H "x-api-key: sk_test_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: onboard-chinedu-001" \
  -d '{
    "firstName": "Chinedu",
    "lastName": "Okafor",
    "email": "chinedu.okafor@example.com",
    "phoneNumber": "+2348012345678",
    "dateOfBirth": "1990-05-15",
    "country": "NG",
    "idType": "NIN",
    "idNumber": "12345678901",
    "address": {
      "street": "15 Admiralty Way",
      "city": "Lagos",
      "state": "Lagos",
      "postalCode": "100001",
      "country": "NG"
    },
    "bankAccount": {
      "accountNumber": "0123456789",
      "bankName": "GTBank",
      "bankCode": "058",
      "currency": "NGN",
      "country": "NG"
    }
  }'
```

The response includes the recipient's `id` and `kycStatus`. Wait for the status to reach `APPROVED` before proceeding. You can poll via `GET /api/v1/recipients/{id}` or listen for the `compliance.approved` webhook.

### Step 2: Create a quote

Request a real-time quote to convert USDC on Solana into NGN:

```bash
curl -X POST https://zynta-lastmile-api.up.railway.app/api/v1/quotes \
  -H "x-api-key: sk_test_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "recipientId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "direction": "OFF_RAMP",
    "sourceChain": "SOLANA",
    "sourceAsset": "USDC",
    "notionalAmount": 1000,
    "destinationCurrency": "NGN",
    "destinationCountry": "NG",
    "deliveryRail": "BANK_TRANSFER"
  }'
```

The response includes the locked `exchangeRate`, `fees`, `destinationAmount`, and an `expiresAt` timestamp. Save the `id`  you will need it in the next step.

```json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "exchangeRate": 1650.00,
  "fees": {
    "platform": 5.00,
    "network": 0.50,
    "total": 5.50
  },
  "destinationAmount": 1640925.00,
  "expiresAt": "2026-03-24T14:15:00Z",
  "status": "ACTIVE"
}
```

### Step 3: Execute the off-ramp transfer

Lock the quote and initiate the transfer:

```bash
curl -X POST https://zynta-lastmile-api.up.railway.app/api/v1/off-ramp \
  -H "x-api-key: sk_test_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: offramp-001" \
  -d '{
    "quoteId": "550e8400-e29b-41d4-a716-446655440000",
    "recipientId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }'
```

The response includes `fundingInstructions` with a crypto deposit address:

```json
{
  "id": "txn_7km3nf...",
  "state": "PENDING_DEPOSIT",
  "fundingInstructions": {
    "depositAddress": "GqN8vW7Qxz4F9kP2mR5tY8uI3oP6aS9dF...",
    "amount": 1000,
    "asset": "USDC",
    "chain": "SOLANA",
    "expiresAt": "2026-03-24T14:15:00Z"
  }
}
```

Send the exact USDC amount to the deposit address before the expiry.

### Step 4: Track the transfer

Poll the transfer status or listen for webhooks:

```bash
curl https://zynta-lastmile-api.up.railway.app/api/v1/off-ramp/txn_7km3nf... \
  -H "x-api-key: sk_test_your_key_here"
```

```json
{
  "id": "txn_7km3nf...",
  "state": "COMPLETED",
  "completedAt": "2026-03-24T14:18:42Z"
}
```

{% hint style="success" %}
That is it. The USDC is received, converted to NGN, and delivered to the recipient's GTBank account,  typically within minutes.
{% endhint %}

### Next steps

* Set up [webhooks](/api-reference/webhooks.md) for real-time transfer notifications
* Explore [on-ramp](/api-reference/transfers/on-ramp-fiat-crypto.md) flows for fiat-to-crypto
* Review [supported currencies](/coverage/supported-currencies.md) and chains
* Use the [sandbox](/guides/testing-in-sandbox.md) to test end-to-end without real funds


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.zynta.com/api-services-getting-started/quickstart.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
