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

# Create a service

> Point Proceeds at your API. One service per product — then add paywalls under it.

Everything in Proceeds starts with a **service**. It wraps one API: base URL, upstream auth, networks, and testnet vs mainnet. Paywalls live under it.

Create one from the dashboard or with a single API call.

## Before you start

* A Proceeds account
* A public HTTP API base URL (for example `https://api.example.com`)
* For the API path: an API key with `services:write` — see [API Keys](/dashboard/api-keys)
* Testnet USDC if you stay in testnet — [faucet](https://testmint.myproceeds.xyz/)

## Using the dashboard

<Steps>
  <Step title="Open Paywalls">
    In the dashboard, go to **Paywalls** and click **New Service**.
  </Step>

  <Step title="Fill in the form">
    | Field                 | Example                                                                                          |
    | --------------------- | ------------------------------------------------------------------------------------------------ |
    | Service name          | `weather-api`                                                                                    |
    | Description           | Optional                                                                                         |
    | Base URL              | `https://api.example.com`                                                                        |
    | Authentication method | How Proceeds authenticates upstream — see [Forward upstream auth](/guides/forward-upstream-auth) |
    | Mode                  | **Testnet** while building, **Mainnet** when you ship                                            |
    | Networks              | At least one — include **Tempo** if you want MPP URLs                                            |
  </Step>

  <Step title="Create Service">
    A name, base URL, and at least one network are required. Everything else can wait.
  </Step>
</Steps>

## Using the API

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.myproceeds.xyz/v1/services \
    -H "Authorization: Bearer mpk_your_key_here" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "weather-api",
      "description": "Public weather endpoints",
      "baseUrl": "https://api.example.com",
      "authMethod": "bearer",
      "authConfig": { "bearerToken": "YOUR_UPSTREAM_TOKEN" },
      "networks": ["base-sepolia", "tempo-testnet"],
      "mode": "testnet"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.myproceeds.xyz/v1/services", {
    method: "POST",
    headers: {
      Authorization: "Bearer mpk_your_key_here",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      name: "weather-api",
      description: "Public weather endpoints",
      baseUrl: "https://api.example.com",
      authMethod: "bearer",
      authConfig: { bearerToken: "YOUR_UPSTREAM_TOKEN" },
      networks: ["base-sepolia", "tempo-testnet"],
      mode: "testnet",
    }),
  });

  const { data: service } = await response.json();
  console.log(service.id);
  ```
</CodeGroup>

Full field reference: [Create a service (API)](/api-reference/create-a-service).

## Next

<Card title="Add a paywall" icon="shield" href="/quickstart/add-a-paywall">
  Price a route and get payment URLs agents can call.
</Card>
