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

# Partners data

> Learn how to retrieve analytics data on Dub by partners, partner groups, and partner tags

<Note>
  Analytics endpoints require a [Pro plan](https://dub.co/pricing) subscription
  or higher. Partner-related analytics also require an active [Dub
  Partners](https://dub.co/partners) program.
</Note>

Partner data allows you to analyze how your partners, partner groups, and partner tags are driving clicks, leads, and sales across your program.

## Partner analytics

The top partners by event count, including partner names and IDs.

<CodeGroup>
  ```javascript Node.js theme={null}
  import { Dub } from "dub";

  export const dub = new Dub({
    token: process.env.DUB_API_KEY,
  });

  const result = await dub.analytics.retrieve({
    event: "sales",
    groupBy: "top_partners",
    interval: "30d",
    // saleType: "new" // Optional: filter by new or recurring sales
  });
  ```

  ```python Python theme={null}
  from dub import Dub

  with Dub(
      token="DUB_API_KEY",
  ) as d_client:
      res = d_client.analytics.retrieve(request={
          "event": "sales",
          "groupBy": "top_partners",
          "interval": "30d",
          # "saleType": "new",  # Optional: filter by new or recurring sales
      })
      print(res)
  ```

  ```php PHP theme={null}
  declare(strict_types=1);

  require 'vendor/autoload.php';

  use Dub;
  use Dub\Models\Operations;

  $sdk = Dub\Dub::builder()
      ->setSecurity('DUB_API_KEY')
      ->build();

  $request = new Operations\RetrieveAnalyticsRequest(
      event: 'sales',
      groupBy: 'top_partners',
      interval: '30d',
      // saleType: 'new', // Optional: filter by new or recurring sales
  );

  $response = $sdk->analytics->retrieve(
      request: $request
  );

  if ($response->oneOf !== null) {
      // handle response
  }
  ```

  ```go Go theme={null}
  package main

  import(
      "context"
      dubgo "github.com/dubinc/dub-go"
      "github.com/dubinc/dub-go/models/operations"
      "log"
  )

  func main() {
      ctx := context.Background()

      s := dubgo.New(
          dubgo.WithSecurity("DUB_API_KEY"),
      )

      res, err := s.Analytics.Retrieve(ctx, operations.RetrieveAnalyticsRequest{
          Event: dubgo.String("sales"),
          GroupBy: dubgo.String("top_partners"),
          Interval: dubgo.String("30d"),
          // SaleType: dubgo.String("new"), // Optional: filter by new or recurring sales
      })
      if err != nil {
          log.Fatal(err)
      }
      if res != nil {
          // handle response
      }
  }
  ```

  ```ruby Ruby theme={null}
  require 'dub'

  s = ::OpenApiSDK::Dub.new(
        security: ::OpenApiSDK::Shared::Security.new(
          token: "DUB_API_KEY",
        ),
      )

  req = ::OpenApiSDK::Operations::RetrieveAnalyticsRequest.new(
    event: "sales",
    groupBy: "top_partners",
    interval: "30d",
    # saleType: "new", # Optional: filter by new or recurring sales
  )

  res = s.analytics.retrieve(req)

  if ! res.one_of.nil?
    # handle response
  end
  ```
</CodeGroup>

You can also filter analytics for a specific partner (or set of partners) by passing the `partnerId` parameter. It supports advanced filtering: single value, multiple values (comma-separated), or exclusion (prefix with `-`).

<CodeGroup>
  ```javascript Node.js theme={null}
  import { Dub } from "dub";

  export const dub = new Dub({
    token: process.env.DUB_API_KEY,
  });

  const result = await dub.analytics.retrieve({
    event: "sales",
    groupBy: "top_links",
    partnerId: "pn_123",
    interval: "30d",
    // saleType: "new" // Optional: filter by new or recurring sales
  });
  ```

  ```python Python theme={null}
  from dub import Dub

  with Dub(
      token="DUB_API_KEY",
  ) as d_client:
      res = d_client.analytics.retrieve(request={
          "event": "sales",
          "groupBy": "top_links",
          "partnerId": "pn_123",
          "interval": "30d",
          # "saleType": "new",  # Optional: filter by new or recurring sales
      })
      print(res)
  ```

  ```php PHP theme={null}
  declare(strict_types=1);

  require 'vendor/autoload.php';

  use Dub;
  use Dub\Models\Operations;

  $sdk = Dub\Dub::builder()
      ->setSecurity('DUB_API_KEY')
      ->build();

  $request = new Operations\RetrieveAnalyticsRequest(
      event: 'sales',
      groupBy: 'top_links',
      partnerId: 'pn_123',
      interval: '30d',
      // saleType: 'new', // Optional: filter by new or recurring sales
  );

  $response = $sdk->analytics->retrieve(
      request: $request
  );

  if ($response->oneOf !== null) {
      // handle response
  }
  ```

  ```go Go theme={null}
  package main

  import(
      "context"
      dubgo "github.com/dubinc/dub-go"
      "github.com/dubinc/dub-go/models/operations"
      "log"
  )

  func main() {
      ctx := context.Background()

      s := dubgo.New(
          dubgo.WithSecurity("DUB_API_KEY"),
      )

      res, err := s.Analytics.Retrieve(ctx, operations.RetrieveAnalyticsRequest{
          Event: dubgo.String("sales"),
          GroupBy: dubgo.String("top_links"),
          PartnerID: dubgo.String("pn_123"),
          Interval: dubgo.String("30d"),
          // SaleType: dubgo.String("new"), // Optional: filter by new or recurring sales
      })
      if err != nil {
          log.Fatal(err)
      }
      if res != nil {
          // handle response
      }
  }
  ```

  ```ruby Ruby theme={null}
  require 'dub'

  s = ::OpenApiSDK::Dub.new(
        security: ::OpenApiSDK::Shared::Security.new(
          token: "DUB_API_KEY",
        ),
      )

  req = ::OpenApiSDK::Operations::RetrieveAnalyticsRequest.new(
    event: "sales",
    groupBy: "top_links",
    partnerId: "pn_123",
    interval: "30d",
    # saleType: "new", # Optional: filter by new or recurring sales
  )

  res = s.analytics.retrieve(req)

  if ! res.one_of.nil?
    # handle response
  end
  ```
</CodeGroup>

## Partner group analytics

The top partner groups by event count, including group names and IDs.

<CodeGroup>
  ```javascript Node.js theme={null}
  import { Dub } from "dub";

  export const dub = new Dub({
    token: process.env.DUB_API_KEY,
  });

  const result = await dub.analytics.retrieve({
    event: "sales",
    groupBy: "top_groups",
    interval: "30d",
    // saleType: "new" // Optional: filter by new or recurring sales
  });
  ```

  ```python Python theme={null}
  from dub import Dub

  with Dub(
      token="DUB_API_KEY",
  ) as d_client:
      res = d_client.analytics.retrieve(request={
          "event": "sales",
          "groupBy": "top_groups",
          "interval": "30d",
          # "saleType": "new",  # Optional: filter by new or recurring sales
      })
      print(res)
  ```

  ```php PHP theme={null}
  declare(strict_types=1);

  require 'vendor/autoload.php';

  use Dub;
  use Dub\Models\Operations;

  $sdk = Dub\Dub::builder()
      ->setSecurity('DUB_API_KEY')
      ->build();

  $request = new Operations\RetrieveAnalyticsRequest(
      event: 'sales',
      groupBy: 'top_groups',
      interval: '30d',
      // saleType: 'new', // Optional: filter by new or recurring sales
  );

  $response = $sdk->analytics->retrieve(
      request: $request
  );

  if ($response->oneOf !== null) {
      // handle response
  }
  ```

  ```go Go theme={null}
  package main

  import(
      "context"
      dubgo "github.com/dubinc/dub-go"
      "github.com/dubinc/dub-go/models/operations"
      "log"
  )

  func main() {
      ctx := context.Background()

      s := dubgo.New(
          dubgo.WithSecurity("DUB_API_KEY"),
      )

      res, err := s.Analytics.Retrieve(ctx, operations.RetrieveAnalyticsRequest{
          Event: dubgo.String("sales"),
          GroupBy: dubgo.String("top_groups"),
          Interval: dubgo.String("30d"),
          // SaleType: dubgo.String("new"), // Optional: filter by new or recurring sales
      })
      if err != nil {
          log.Fatal(err)
      }
      if res != nil {
          // handle response
      }
  }
  ```

  ```ruby Ruby theme={null}
  require 'dub'

  s = ::OpenApiSDK::Dub.new(
        security: ::OpenApiSDK::Shared::Security.new(
          token: "DUB_API_KEY",
        ),
      )

  req = ::OpenApiSDK::Operations::RetrieveAnalyticsRequest.new(
    event: "sales",
    groupBy: "top_groups",
    interval: "30d",
    # saleType: "new", # Optional: filter by new or recurring sales
  )

  res = s.analytics.retrieve(req)

  if ! res.one_of.nil?
    # handle response
  end
  ```
</CodeGroup>

You can also filter analytics by one or more partner groups by passing the `groupId` parameter. It supports advanced filtering: single value, multiple values (comma-separated), or exclusion (prefix with `-`).

<CodeGroup>
  ```javascript Node.js theme={null}
  import { Dub } from "dub";

  export const dub = new Dub({
    token: process.env.DUB_API_KEY,
  });

  const result = await dub.analytics.retrieve({
    event: "sales",
    groupBy: "top_partners",
    groupId: "grp_123",
    interval: "30d",
    // saleType: "new" // Optional: filter by new or recurring sales
  });
  ```

  ```python Python theme={null}
  from dub import Dub

  with Dub(
      token="DUB_API_KEY",
  ) as d_client:
      res = d_client.analytics.retrieve(request={
          "event": "sales",
          "groupBy": "top_partners",
          "groupId": "grp_123",
          "interval": "30d",
          # "saleType": "new",  # Optional: filter by new or recurring sales
      })
      print(res)
  ```

  ```php PHP theme={null}
  declare(strict_types=1);

  require 'vendor/autoload.php';

  use Dub;
  use Dub\Models\Operations;

  $sdk = Dub\Dub::builder()
      ->setSecurity('DUB_API_KEY')
      ->build();

  $request = new Operations\RetrieveAnalyticsRequest(
      event: 'sales',
      groupBy: 'top_partners',
      groupId: 'grp_123',
      interval: '30d',
      // saleType: 'new', // Optional: filter by new or recurring sales
  );

  $response = $sdk->analytics->retrieve(
      request: $request
  );

  if ($response->oneOf !== null) {
      // handle response
  }
  ```

  ```go Go theme={null}
  package main

  import(
      "context"
      dubgo "github.com/dubinc/dub-go"
      "github.com/dubinc/dub-go/models/operations"
      "log"
  )

  func main() {
      ctx := context.Background()

      s := dubgo.New(
          dubgo.WithSecurity("DUB_API_KEY"),
      )

      res, err := s.Analytics.Retrieve(ctx, operations.RetrieveAnalyticsRequest{
          Event: dubgo.String("sales"),
          GroupBy: dubgo.String("top_partners"),
          GroupID: dubgo.String("grp_123"),
          Interval: dubgo.String("30d"),
          // SaleType: dubgo.String("new"), // Optional: filter by new or recurring sales
      })
      if err != nil {
          log.Fatal(err)
      }
      if res != nil {
          // handle response
      }
  }
  ```

  ```ruby Ruby theme={null}
  require 'dub'

  s = ::OpenApiSDK::Dub.new(
        security: ::OpenApiSDK::Shared::Security.new(
          token: "DUB_API_KEY",
        ),
      )

  req = ::OpenApiSDK::Operations::RetrieveAnalyticsRequest.new(
    event: "sales",
    groupBy: "top_partners",
    groupId: "grp_123",
    interval: "30d",
    # saleType: "new", # Optional: filter by new or recurring sales
  )

  res = s.analytics.retrieve(req)

  if ! res.one_of.nil?
    # handle response
  end
  ```
</CodeGroup>

## Partner tag analytics

The top partner tags by event count, including tag names and IDs.

<CodeGroup>
  ```javascript Node.js theme={null}
  import { Dub } from "dub";

  export const dub = new Dub({
    token: process.env.DUB_API_KEY,
  });

  const result = await dub.analytics.retrieve({
    event: "sales",
    groupBy: "top_partner_tags",
    interval: "30d",
    // saleType: "new" // Optional: filter by new or recurring sales
  });
  ```

  ```python Python theme={null}
  from dub import Dub

  with Dub(
      token="DUB_API_KEY",
  ) as d_client:
      res = d_client.analytics.retrieve(request={
          "event": "sales",
          "groupBy": "top_partner_tags",
          "interval": "30d",
          # "saleType": "new",  # Optional: filter by new or recurring sales
      })
      print(res)
  ```

  ```php PHP theme={null}
  declare(strict_types=1);

  require 'vendor/autoload.php';

  use Dub;
  use Dub\Models\Operations;

  $sdk = Dub\Dub::builder()
      ->setSecurity('DUB_API_KEY')
      ->build();

  $request = new Operations\RetrieveAnalyticsRequest(
      event: 'sales',
      groupBy: 'top_partner_tags',
      interval: '30d',
      // saleType: 'new', // Optional: filter by new or recurring sales
  );

  $response = $sdk->analytics->retrieve(
      request: $request
  );

  if ($response->oneOf !== null) {
      // handle response
  }
  ```

  ```go Go theme={null}
  package main

  import(
      "context"
      dubgo "github.com/dubinc/dub-go"
      "github.com/dubinc/dub-go/models/operations"
      "log"
  )

  func main() {
      ctx := context.Background()

      s := dubgo.New(
          dubgo.WithSecurity("DUB_API_KEY"),
      )

      res, err := s.Analytics.Retrieve(ctx, operations.RetrieveAnalyticsRequest{
          Event: dubgo.String("sales"),
          GroupBy: dubgo.String("top_partner_tags"),
          Interval: dubgo.String("30d"),
          // SaleType: dubgo.String("new"), // Optional: filter by new or recurring sales
      })
      if err != nil {
          log.Fatal(err)
      }
      if res != nil {
          // handle response
      }
  }
  ```

  ```ruby Ruby theme={null}
  require 'dub'

  s = ::OpenApiSDK::Dub.new(
        security: ::OpenApiSDK::Shared::Security.new(
          token: "DUB_API_KEY",
        ),
      )

  req = ::OpenApiSDK::Operations::RetrieveAnalyticsRequest.new(
    event: "sales",
    groupBy: "top_partner_tags",
    interval: "30d",
    # saleType: "new", # Optional: filter by new or recurring sales
  )

  res = s.analytics.retrieve(req)

  if ! res.one_of.nil?
    # handle response
  end
  ```
</CodeGroup>

You can also filter analytics by one or more partner tags by passing the `partnerTagId` parameter. It supports advanced filtering: single value, multiple values (comma-separated), or exclusion (prefix with `-`).

<CodeGroup>
  ```javascript Node.js theme={null}
  import { Dub } from "dub";

  export const dub = new Dub({
    token: process.env.DUB_API_KEY,
  });

  const result = await dub.analytics.retrieve({
    event: "sales",
    groupBy: "top_partners",
    partnerTagId: "ptag_123",
    interval: "30d",
    // saleType: "new" // Optional: filter by new or recurring sales
  });
  ```

  ```python Python theme={null}
  from dub import Dub

  with Dub(
      token="DUB_API_KEY",
  ) as d_client:
      res = d_client.analytics.retrieve(request={
          "event": "sales",
          "groupBy": "top_partners",
          "partnerTagId": "ptag_123",
          "interval": "30d",
          # "saleType": "new",  # Optional: filter by new or recurring sales
      })
      print(res)
  ```

  ```php PHP theme={null}
  declare(strict_types=1);

  require 'vendor/autoload.php';

  use Dub;
  use Dub\Models\Operations;

  $sdk = Dub\Dub::builder()
      ->setSecurity('DUB_API_KEY')
      ->build();

  $request = new Operations\RetrieveAnalyticsRequest(
      event: 'sales',
      groupBy: 'top_partners',
      partnerTagId: 'ptag_123',
      interval: '30d',
      // saleType: 'new', // Optional: filter by new or recurring sales
  );

  $response = $sdk->analytics->retrieve(
      request: $request
  );

  if ($response->oneOf !== null) {
      // handle response
  }
  ```

  ```go Go theme={null}
  package main

  import(
      "context"
      dubgo "github.com/dubinc/dub-go"
      "github.com/dubinc/dub-go/models/operations"
      "log"
  )

  func main() {
      ctx := context.Background()

      s := dubgo.New(
          dubgo.WithSecurity("DUB_API_KEY"),
      )

      res, err := s.Analytics.Retrieve(ctx, operations.RetrieveAnalyticsRequest{
          Event: dubgo.String("sales"),
          GroupBy: dubgo.String("top_partners"),
          PartnerTagID: dubgo.String("ptag_123"),
          Interval: dubgo.String("30d"),
          // SaleType: dubgo.String("new"), // Optional: filter by new or recurring sales
      })
      if err != nil {
          log.Fatal(err)
      }
      if res != nil {
          // handle response
      }
  }
  ```

  ```ruby Ruby theme={null}
  require 'dub'

  s = ::OpenApiSDK::Dub.new(
        security: ::OpenApiSDK::Shared::Security.new(
          token: "DUB_API_KEY",
        ),
      )

  req = ::OpenApiSDK::Operations::RetrieveAnalyticsRequest.new(
    event: "sales",
    groupBy: "top_partners",
    partnerTagId: "ptag_123",
    interval: "30d",
    # saleType: "new", # Optional: filter by new or recurring sales
  )

  res = s.analytics.retrieve(req)

  if ! res.one_of.nil?
    # handle response
  end
  ```
</CodeGroup>
