# Retrieve monthly stats for all subusers

## API Overview

Subuser statistics enable you to view specific segments of your statistics, as compared to the general overview of all email activity on your account. SendGrid tracks your subusers' emails sent, bounces, and spam reports. Unsubscribes, clicks, and opens are tracked if you have enabled the required settings.

For more information, see our [Subusers documentation](/docs/sendgrid/ui/account-and-settings/subusers/). You can also access [Subuser Statistics in the SendGrid console](https://app.sendgrid.com/statistics/subuser).

## Operation overview

```json
{"path":"https://api.sendgrid.com/v3/subusers/stats/monthly","method":"get","servers":[{"url":"https://api.sendgrid.com","description":"for global users and subusers"},{"url":"https://api.eu.sendgrid.com","description":"for EU regional subusers"}]}
```

**This endpoint allows you to retrieve the monthly email statistics for all subusers over the given date range.**

When using the `sort_by_metric` to sort your stats by a specific metric, you can not sort by the following metrics:
`bounce_drops`, `deferred`, `invalid_emails`, `processed`, `spam_report_drops`, `spam_reports`, or `unsubscribe_drops`.

## Operation details

### Authentication

API Key

### Headers

```json
[{"in":"header","name":"Authorization","required":true,"default":"Bearer <<YOUR_API_KEY_HERE>>","schema":{"type":"string"}}]
```

### Query string

```json
[{"name":"date","in":"query","description":"The date of the month to retrieve statistics for. Must be formatted YYYY-MM-DD","required":true,"schema":{"type":"string"}},{"name":"subuser","in":"query","description":"A substring search of your subusers.","required":false,"schema":{"type":"string"}},{"name":"sort_by_metric","in":"query","description":"The metric that you want to sort by. Metrics that you can sort by are: `blocks`, `bounces`, `clicks`, `delivered`, `opens`, `requests`, `unique_clicks`, `unique_opens`, and `unsubscribes`.'","required":false,"schema":{"type":"string","default":"delivered","enum":["blocks","bounces","clicks","delivered","opens","requests","unique_clicks","unique_opens","unsubscribes"],"refName":"SortByMetric","modelName":"SortByMetric"}},{"name":"sort_by_direction","in":"query","description":"The direction you want to sort.","required":false,"schema":{"type":"string","default":"desc","enum":["desc","asc"],"refName":"SortByDirection1","modelName":"SortByDirection1"}},{"name":"limit","in":"query","description":"Optional field to limit the number of results returned.","required":false,"schema":{"type":"integer","default":5}},{"name":"offset","in":"query","description":"Optional beginning point in the list to retrieve from.","required":false,"schema":{"type":"integer","default":0}}]
```

### Responses

```json
[{"responseCode":"200","schema":{"description":"","content":{"application/json":{"schema":{"title":"subuser_stats","type":"object","example":{"date":"2016-02-01","stats":[{"first_name":"John","last_name":"Doe","metrics":{"blocks":0,"bounce_drops":0,"bounces":0,"clicks":5,"deferred":0,"delivered":0,"invalid_emails":0,"opens":10,"processed":10,"requests":10,"spam_report_drops":0,"spam_reports":0,"unique_clicks":0,"unique_opens":0,"unsubscribe_drops":0,"unsubscribes":0},"name":"user1","type":"subuser"}]},"refName":"SubuserStats","modelName":"SubuserStats","properties":{"date":{"type":"string","description":"The date the statistics were gathered."},"stats":{"type":"array","description":"The list of statistics.","items":{"type":"object","properties":{"first_name":{"type":"string","description":"The first name of the subuser."},"last_name":{"type":"string","description":"The last name of the subuser."},"metrics":{"type":"object","properties":{"blocks":{"type":"integer","description":"The number of emails that were not allowed to be delivered by ISPs."},"bounce_drops":{"type":"integer","description":"The number of emails that were dropped because of a bounce."},"bounces":{"type":"integer","description":"The number of emails that bounced instead of being delivered."},"clicks":{"type":"integer","description":"The number of links that were clicked in your emails."},"deferred":{"type":"integer","description":"The number of emails that temporarily could not be delivered."},"delivered":{"type":"integer","description":"The number of emails SendGrid was able to confirm were actually delivered to a recipient."},"invalid_emails":{"type":"integer","description":"The number of recipients who had malformed email addresses or whose mail provider reported the address as invalid."},"opens":{"type":"integer","description":"The total number of times your emails were opened by recipients."},"processed":{"type":"integer","description":"Requests from your website, application, or mail client via SMTP Relay or the API that SendGrid processed."},"requests":{"type":"integer","description":"The number of emails that were requested to be delivered."},"spam_report_drops":{"type":"integer","description":"The number of emails that were dropped due to a recipient previously marking your emails as spam."},"spam_reports":{"type":"integer","description":"The number of recipients who marked your email as spam."},"unique_clicks":{"type":"integer","description":"The number of unique recipients who clicked links in your emails."},"unique_opens":{"type":"integer","description":"The number of unique recipients who opened your emails."},"unsubscribe_drops":{"type":"integer","description":"The number of emails dropped due to a recipient unsubscribing from your emails."},"unsubscribes":{"type":"integer","description":"The number of recipients who unsubscribed from your emails."}}},"name":{"type":"string","description":"The username of the subuser."},"type":{"type":"string","description":"The type of account."}}}}}},"examples":{"response":{"value":{"date":"2016-02-01","stats":[{"first_name":"John","last_name":"Doe","metrics":{"blocks":0,"bounce_drops":0,"bounces":0,"clicks":0,"deferred":0,"delivered":0,"invalid_emails":0,"opens":1,"processed":0,"requests":100,"spam_report_drops":0,"spam_reports":99,"unique_clicks":0,"unique_opens":0,"unsubscribe_drops":0,"unsubscribes":0},"name":"user1","type":"subuser"},{"first_name":"Jane","last_name":"Doe","metrics":{"blocks":0,"bounce_drops":0,"bounces":0,"clicks":5,"deferred":0,"delivered":0,"invalid_emails":0,"opens":10,"processed":10,"requests":10,"spam_report_drops":0,"spam_reports":0,"unique_clicks":0,"unique_opens":0,"unsubscribe_drops":0,"unsubscribes":0},"name":"user2","type":"subuser"}]}}}}}}}]
```

Retrieve monthly stats for all subusers

```js
const client = require("@sendgrid/client");
client.setApiKey(process.env.SENDGRID_API_KEY);

const queryParams = {
  date: "2009-07-06",
  limit: 5,
  sort_by_direction: "desc",
  sort_by_metric: "delivered",
};

const request = {
  url: `/v3/subusers/stats/monthly`,
  method: "GET",
  qs: queryParams,
};

client
  .request(request)
  .then(([response, body]) => {
    console.log(response.statusCode);
    console.log(response.body);
  })
  .catch((error) => {
    console.error(error);
  });
```

```python
import os
from sendgrid import SendGridAPIClient


sg = SendGridAPIClient(os.environ.get("SENDGRID_API_KEY"))

params = {
    "date": "2009-07-06",
    "sort_by_metric": "delivered",
    "sort_by_direction": "desc",
    "limit": 5,
}

response = sg.client.subusers.stats.monthly.get(query_params=params)

print(response.status_code)
print(response.body)
print(response.headers)
```

```csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SendGrid;

public class Program {
    public static async Task Main() {
        string apiKey = Environment.GetEnvironmentVariable("SENDGRID_API_KEY");
        var client = new SendGridClient(apiKey);

        var queryParams =
            @"{'date': '2009-07-06', 'sort_by_metric': 'delivered', 'sort_by_direction': 'desc', 'limit': 5}";

        var response = await client.RequestAsync(
            method: SendGridClient.Method.GET,
            urlPath: "subusers/stats/monthly",
            queryParams: queryParams);

        Console.WriteLine(response.StatusCode);
        Console.WriteLine(response.Body.ReadAsStringAsync().Result);
        Console.WriteLine(response.Headers.ToString());
    }
}
```

```java
import com.sendgrid.*;
import java.io.IOException;

public class Example {
    public static void main(String[] args) throws IOException {
        try {
            SendGrid sg = new SendGrid(System.getenv("SENDGRID_API_KEY"));
            Request request = new Request();
            request.setMethod(Method.GET);
            request.setEndpoint("/subusers/stats/monthly");
            request.addQueryParam("date", "2009-07-06");
            request.addQueryParam("sort_by_metric", "delivered");
            request.addQueryParam("sort_by_direction", "desc");
            request.addQueryParam("limit", "5");
            Response response = sg.api(request);
            System.out.println(response.getStatusCode());
            System.out.println(response.getBody());
            System.out.println(response.getHeaders());
        } catch (IOException ex) {
            throw ex;
        }
    }
}
```

```go
package main

import (
	"fmt"
	"github.com/sendgrid/sendgrid-go"
	"os"
)

func main() {
	apiKey := os.Getenv("SENDGRID_API_KEY")
	host := "https://api.sendgrid.com"
	request := sendgrid.GetRequest(apiKey, "/v3/subusers/stats/monthly", host)
	request.Method = "GET"
	queryParams := make(map[string]string)
	queryParams["date"] = "2009-07-06"
	queryParams["sort_by_metric"] = "delivered"
	queryParams["sort_by_direction"] = "desc"
	queryParams["limit"] = "5"
	request.QueryParams = queryParams
	response, err := sendgrid.API(request)
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	} else {
		fmt.Println(response.StatusCode)
		fmt.Println(response.Body)
		fmt.Println(response.Headers)
	}
}
```

```php
<?php
// Uncomment the next line if you're using a dependency loader (such as Composer) (recommended)
// require 'vendor/autoload.php';

// Uncomment next line if you're not using a dependency loader (such as Composer)
// require_once '<PATH TO>/sendgrid-php.php';

$apiKey = getenv("SENDGRID_API_KEY");
$sg = new \SendGrid($apiKey);
$query_params = json_decode('{
    "date": "2009-07-06",
    "sort_by_metric": "delivered",
    "sort_by_direction": "desc",
    "limit": 5
}');

try {
    $response = $sg->client
        ->subusers()
        ->stats()
        ->monthly()
        ->get(null, $query_params);
    print $response->statusCode() . "\n";
    print_r($response->headers());
    print $response->body() . "\n";
} catch (Exception $ex) {
    echo "Caught exception: " . $ex->getMessage();
}
```

```ruby
require 'sendgrid-ruby'
include SendGrid

sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
params = JSON.parse('{
  "date": "2009-07-06",
  "sort_by_metric": "delivered",
  "sort_by_direction": "desc",
  "limit": 5
}')

response = sg.client.subusers.stats.monthly.get(query_params: params)
puts response.status_code
puts response.headers
puts response.body
```

```bash
curl -G -X GET "https://api.sendgrid.com/v3/subusers/stats/monthly?date=2009-07-06&sort_by_metric=delivered&sort_by_direction=desc&limit=5" \
--header "Authorization: Bearer $SENDGRID_API_KEY"
```
