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

# Register Your Merchant Account

> Submit a self-serve application to reserve your merchant ID and activate signed payment links.

After [generating your key pair](/integration/key-generation), submit a self-serve application to Blink. The application endpoint reserves a `merchantId` for you immediately so you can wire it into your signer and start testing. The reserved ID stays inert until a Blink operator manually reviews and approves your submission, at which point it becomes a fully active merchant in the registry.

<Info>
  You can begin wiring `merchantId` into your signer right away. Signed payloads will fail verification with `MERCHANT_NOT_REGISTERED` until approval lands.
</Info>

## How to register

Two paths, same outcome — pick whichever fits your team.

<CardGroup cols={2}>
  <Card title="Self-serve API" icon="bolt" href="#submit-your-application">
    Submit a JSON application and get a reserved `merchantId` back in seconds. Best when you want to start wiring code immediately.
  </Card>

  <Card title="Talk to the team" icon="calendar" href="https://calendar.app.google/3fqK5VntM89fFXnJ9">
    Book a meeting with the Blink team to walk through your use case and get set up. Best when you have integration questions or want a tailored kickoff.
  </Card>
</CardGroup>

## Submit your application

`POST https://api.blink.cash/v1/merchants/applications`

<Note>
  Registering for the [testnet sandbox](/integration/testnet-sandbox)? Submit to `https://api-sandbox.blink.cash/v1/merchants/applications` instead — sandbox merchants are separate from production and are approved automatically.
</Note>

```bash theme={null}
curl -X POST https://api.blink.cash/v1/merchants/applications \
  -H 'Content-Type: application/json' \
  -d @- <<'JSON'
{
  "email": "founder@coolapp.com",
  "domain": "coolapp.com",
  "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...\n-----END PUBLIC KEY-----\n",
  "telegram": "@cooldev",
  "description": "Cool App is a mobile-first crypto rewards platform that lets users top up their game balance via Swype."
}
JSON
```

Successful response (`202 Accepted`):

```json theme={null}
{
  "applicationId": "11112222-3333-4444-5555-666677778888",
  "merchantId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "status": "PENDING",
  "message": "Application received. Your merchantId is reserved and will activate after a Swype operator reviews and approves your submission."
}
```

## Request fields

| Field         | Type     | Required | Validation                                                                                                 |
| ------------- | -------- | -------- | ---------------------------------------------------------------------------------------------------------- |
| `email`       | `string` | Yes      | RFC 5322 email, max 255 chars. Used by Blink to follow up.                                                 |
| `domain`      | `string` | Yes      | Hostname (for example, `coolapp.com`), max 255 chars. Defaults to the merchant's display name on approval. |
| `publicKey`   | `string` | Yes      | PEM-encoded ECDSA P-256 public key from [Key Generation](/integration/key-generation). Max 4096 chars.     |
| `telegram`    | `string` | No       | Optional Telegram handle (`@user` or `user`), 3–64 alphanumeric or underscore chars.                       |
| `description` | `string` | Yes      | 20–1000 chars describing your product and how you intend to use Blink.                                     |

## Response codes

| Code                                 | Meaning                                                                                                                         |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
| `202`                                | Application received. Operator review pending.                                                                                  |
| `400`                                | Validation error in the request body (bad email, malformed PEM, etc.).                                                          |
| `409 MERCHANT_APPLICATION_DUPLICATE` | A pending application with the same public key already exists. Wait for review or generate a new key pair before re-submitting. |
| `429 RATE_LIMITED`                   | Too many submissions from your IP. Try again after the `Retry-After` window.                                                    |

## What happens next

<Steps>
  <Step title="Review">
    The Blink team is notified immediately and reviews your application.
  </Step>

  <Step title="Approval">
    Once approved, your `merchantId` becomes valid for signed payment links.
  </Step>

  <Step title="Confirmation">
    You'll receive a confirmation out-of-band (email or Telegram) when approval lands.
  </Step>
</Steps>

## What Blink registers

| Field         | Value                                               |
| ------------- | --------------------------------------------------- |
| `merchantId`  | Your reserved UUID (returned in the `202` response) |
| `displayName` | Defaults to your `domain`, editable on approval     |
| `algorithm`   | `ECDSA_P256_SHA256`                                 |
| `status`      | `PENDING` until reviewed, then `ACTIVE`             |
| `publicKey`   | The PEM you submitted                               |

Once active, Blink's hosted flow verifies every signed payment link your signer produces by fetching your public key from the API (`GET /v1/merchants/{id}/public-key`).

## Additional domains

Your `domain` above is whitelisted automatically on approval. If you serve the same app from other origins (an apex plus `www`, a staging or preview host, a partner domain), whitelist each one — up to 10 — via [Whitelist Additional Domains](/integration/merchant-domains), or the deposit flow won't authenticate on those origins.

## Key rotation

Public key rotation after approval is handled by contacting Blink directly.

<Steps>
  <Step title="Generate a new key pair">
    Follow the same process in [Key Generation](/integration/key-generation).
  </Step>

  <Step title="Send the new public key to Blink">
    Email your updated PEM to [s@blink.cash](mailto:s@blink.cash) or [book a meeting](https://calendar.app.google/3fqK5VntM89fFXnJ9) with the Blink team.
  </Step>

  <Step title="Update your signer endpoint">
    Once confirmed, swap your signer endpoint to use the new private key.
  </Step>

  <Step title="Old key deactivation">
    The old key is deactivated immediately. Do not rotate during high-traffic periods.
  </Step>
</Steps>
