# 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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>
