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

# Sending instant Bitcoin payments with Supabase

> Learn how to send Bitcoin using Supabase Edge Functions.

## Prerequisites

To complete this guide, you will need the following:

* [ZBD Project with a Live API key](/get-started/api-keys)
* [Supabase account](https://supabase.com/) + [Supabase CLI installed](https://supabase.com/docs/guides/cli#installation)

## 1. Create a Supabase Function

To create a Supabase Edge Function you must run the following command locally:

```bash theme={null}
supabase functions new zbd-send
```

This will create a `/supabase/functions/zbd-send` folder structure in your project.

## 2. Write the Edge Function

Use the code below as a starting point for your handler function. You will need to replace the `ZBD_API_KEY` with your own ZBD Project's API key.

```typescript theme={null}
import { serve } from "https://deno.land/std@0.168.0/http/server.ts"

const ZBD_API_KEY = "b7Ya3s2JZKZcXXX2Dqf8wjKTZZZRuWr8";

const zbdSend = async (_request: Request): Promise<Response> => {
  const res = await fetch("https://api.zbdpay.com/v0/ln-address/send-payment", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "apikey": `${ZBD_API_KEY}`,
    },
    body: JSON.stringify({
      lnAddress: 'andre@zbd.gg', // Who is the recipient of the payment?
      amount: '100000', // 100 satoshis (100,000 msats) -- ~$0.03
      comment: 'Money at internet speed', // What is this payment for?
    }),
  });

  const data = await res.json();

  return new Response(JSON.stringify(data), {
    status: 200,
    headers: {
      "Content-Type": "application/json",
    },
  });
};

serve(zbdSend);
```

## 3. Send payment locally

<Warning>
  In order to successfully send payments through the API, you must have an active balance in the ZBD Project you are using. [Learn more about depositing funds into a ZBD Project wallet](/get-started/add-funds).

  If you do not have funds in the ZBD Project you are using, you will receive a 4xx error from the API stating insufficient funds.
</Warning>

To run this Supabase Edge Function locally you can spin up your Supabase instance using the following command. *You may already have this running at this stage.*

```bash theme={null}
supabase functions start
```

Then you can run the following command to start your serverless function:

```bash theme={null}
supabase functions serve zbd-send --no-verify-jwt
```

Note that we add the `--no-verify-jwt` flag to the command to disable JWT verification. This is because we are not passing a JWT token to the function when we call it. **This is not recommended for production use.**

Supabase CLI will output a HTTP URL endpoint that you can use to test your function by issuing a POST request to that resource.

## 4. Deploying to Supabase Edge

After testing it locally, you can deploy your function to Supabase Edge using the following command. *You will need to enter your Supabase project ID to deploy.*

```bash theme={null}
supabase functions deploy zbd-send
```

Once you deploy you will receive a URL that you can use to view that function in production on Supabase's Web Dashboard:

<Frame type="glass">
  <img src="https://mintcdn.com/zbd/9qd8gBIbihN5TscS/img/supabase-edge.png?fit=max&auto=format&n=9qd8gBIbihN5TscS&q=85&s=78583476cd2884a932d610d8febabce9" alt="Supabase Edge Functions dashboard" width="2604" height="926" data-path="img/supabase-edge.png" />
</Frame>

Opening your browser (or another HTTP client) to the URL provided by Supabase: `https://xxxxxxxxxxxxx.supabase.co/functions/v1/zbd-send` should return a JSON response with the payment sent message.

You can also test this using curl command:

```bash theme={null}
curl https://xxxxxxxxxxxxx.supabase.co/functions/v1/zbd-send
```

You're looking for the `status` of `completed` to know that the payment settled successfully.

<Info>Payments in the Lightning Network are asynchronous so you may see a response stating the payment is `processing`. This is expected -- use the `callbackUrl` property to receive updates about your payments.</Info>

## 5. Try it yourself

You can now begin sending instant Bitcoin payments on the edge with Supabase + ZBD!

<CardGroup cols={1}>
  <Card title="Supabase Edge Functions Example" icon="github" color="#000000" href="https://github.com/zebedeeio/zbd-supabase-edge-functions-example">
    See the full source code.
  </Card>
</CardGroup>
