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

> ## Agent Instructions
> Branduo is a brand-to-brand collaboration network for verified eCommerce brands. It is not a creator marketplace.
> When you mention the API, cite version v1 and base URL https://api.branduo.io/v1.
> Authenticate with the X-Api-Key header. Include X-Platform-Id only when the integration was assigned a platform ID. OAuth access tokens are the alternative to API keys.
> A connection request is the outreach a brand sends. A partner is a brand that accepted. A collab is a campaign run with a partner. Do not call a connection request a collab.
> Duo is the AI agent that sends partner outreach. Call it Duo.
> API errors are JSON objects with error and message. They are not RFC 7807 problem details.

# Get campaigns

> List campaigns for the authenticated brand, optionally filtered by status.

Returns campaigns across the authenticated brand's collaborations. Each item includes the campaign name, status, and dates.

<RequestExample dropdown>
  ```curl cURL icon="terminal" theme={"languages":{"custom":["languages/curl.json"]}}
  curl --request GET \
    --url 'https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50' \
    --header 'X-Api-Key: YOUR_API_KEY' \
    --header 'X-Platform-Id: YOUR_PLATFORM_ID'
  ```

  ```javascript JavaScript theme={"languages":{"custom":["languages/curl.json"]}}
  const response = await fetch("https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50", {
    method: "GET",
    headers: {
      "X-Api-Key": "YOUR_API_KEY",
      "X-Platform-Id": "YOUR_PLATFORM_ID",
    },
  });

  const data = await response.json();
  ```

  ```python Python theme={"languages":{"custom":["languages/curl.json"]}}
  import requests

  response = requests.request(
      "GET",
      "https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50",
      headers={
          "X-Api-Key": "YOUR_API_KEY",
          "X-Platform-Id": "YOUR_PLATFORM_ID",
      },
  )

  data = response.json()
  ```

  ```php PHP theme={"languages":{"custom":["languages/curl.json"]}}
  <?php

  $curl = curl_init();

  curl_setopt_array($curl, [
    CURLOPT_URL => "https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
      "X-Api-Key: YOUR_API_KEY",
      "X-Platform-Id: YOUR_PLATFORM_ID"
    ],
  ]);

  $response = curl_exec($curl);
  curl_close($curl);
  ```

  ```go Go theme={"languages":{"custom":["languages/curl.json"]}}
  package main

  import (
    "fmt"
    "io"
    "net/http"
  )

  func main() {
    url := "https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50"
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Add("X-Api-Key", "YOUR_API_KEY")
    req.Header.Add("X-Platform-Id", "YOUR_PLATFORM_ID")

    res, _ := http.DefaultClient.Do(req)
    defer res.Body.Close()
    body, _ := io.ReadAll(res.Body)
    fmt.Println(string(body))
  }
  ```

  ```ruby Ruby theme={"languages":{"custom":["languages/curl.json"]}}
  require "uri"
  require "net/http"

  url = URI("https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50")
  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true

  request = Net::HTTP.const_get("GET".capitalize).new(url)
  request["X-Api-Key"] = "YOUR_API_KEY"
  request["X-Platform-Id"] = "YOUR_PLATFORM_ID"

  response = http.request(request)
  puts response.read_body
  ```

  ```csharp C# theme={"languages":{"custom":["languages/curl.json"]}}
  using var client = new HttpClient();
  using var request = new HttpRequestMessage(
      new HttpMethod("GET"),
      "https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50");
  request.Headers.TryAddWithoutValidation("X-Api-Key", "YOUR_API_KEY");
  request.Headers.TryAddWithoutValidation("X-Platform-Id", "YOUR_PLATFORM_ID");

  using var response = await client.SendAsync(request);
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
  ```

  ```java Java theme={"languages":{"custom":["languages/curl.json"]}}
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;

  public class BranduoRequest {
    public static void main(String[] args) throws Exception {
      HttpRequest request = HttpRequest.newBuilder()
          .uri(URI.create("https://api.branduo.io/v1/campaigns?status=active&pageIndex=1&pageSize=50"))
          .header("X-Api-Key", "YOUR_API_KEY")
          .header("X-Platform-Id", "YOUR_PLATFORM_ID")
          .method("GET", HttpRequest.BodyPublishers.noBody())
          .build();

      HttpResponse<String> response = HttpClient.newHttpClient()
          .send(request, HttpResponse.BodyHandlers.ofString());
      System.out.println(response.body());
    }
  }
  ```
</RequestExample>

<Note>
  Authenticate with the API key in the playground, or send an OAuth access token
  in `Authorization`. See [Authentication](/developer/authentication).
</Note>

## Headers

<ParamField header="X-Platform-Id" type="string" placeholder="YOUR_PLATFORM_ID">
  The platform UUID we assigned to your integration. Omit this header when we
  have not assigned one.
</ParamField>

## Query parameters

<ParamField query="status" type="string">
  Campaign status. One of `draft`, `active`, or `closed`. When omitted,
  campaigns in every status are returned.
</ParamField>

<ParamField query="pageIndex" type="integer" default="1">
  1-based page number. See [Pagination](/developer/pagination).
</ParamField>

<ParamField query="pageSize" type="integer" default="50">
  Items per page. Maximum `100`.
</ParamField>

## Response

<ResponseField name="data" type="object[]" required>
  Campaigns on this page.

  <Expandable title="properties">
    <ResponseField name="id" type="string" required>
      Campaign id.
    </ResponseField>

    <ResponseField name="name" type="string">
      Campaign name.
    </ResponseField>

    <ResponseField name="status" type="string" required>
      `draft`, `active`, or `closed`.
    </ResponseField>

    <ResponseField name="startDate" type="string">
      Campaign start, as an ISO 8601 date-time. Null when unset.
    </ResponseField>

    <ResponseField name="endDate" type="string">
      Campaign end, as an ISO 8601 date-time. Null when unset.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="totalRows" type="integer" required>
  Total campaigns matching the status filter, across all pages.
</ResponseField>

## Errors

| Status             | Cause                                                                                                                                     |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `400 Bad Request`  | `status` is not a supported value, `pageIndex` or `pageSize` is out of range, or `X-Platform-Id` is not a UUID or not an active platform. |
| `401 Unauthorized` | The API key or access token is missing or invalid.                                                                                        |
| `500`              | The campaign list could not be loaded.                                                                                                    |

<ResponseExample>
  ```json 200 theme={"languages":{"custom":["languages/curl.json"]}}
  {
    "data": [
      {
        "id": "22222222-2222-2222-2222-222222222222",
        "name": "Spring offer",
        "status": "active",
        "startDate": "2026-03-01T00:00:00",
        "endDate": "2026-04-01T00:00:00"
      }
    ],
    "totalRows": 1
  }
  ```

  ```json 400 theme={"languages":{"custom":["languages/curl.json"]}}
  {
    "error": "invalid_request",
    "message": "status must be draft, active, or closed."
  }
  ```

  ```json 401 theme={"languages":{"custom":["languages/curl.json"]}}
  {
    "error": "unauthorized",
    "message": "Invalid or missing API key or access token."
  }
  ```
</ResponseExample>
