# GET all IP Pools that have Associated IPs

## API Overview

The IP Address Management API combines functionality that was previously split between the Twilio SendGrid [IP Address API](/docs/sendgrid/api-reference/ip-address) and [IP Pools API](/docs/sendgrid/api-reference/ip-pools). This functionality includes adding IP addresses to your account, assigning IP addresses to IP Pools and Subusers, among other tasks. More details about each operation can be found in the descriptions and schemas for each endpoint.

> \[!NOTE]
>
> Regional Email sending in the European Union (EU) is available for [Twilio SendGrid Pro plan or above](https://sendgrid.com/en-us/pricing). EU Regional Email sending requires use of an EU IP address and EU subuser. Learn more about [sending emails with Twilio SendGrid on EU servers](https://www.twilio.com/en-us/blog/send-emails-in-eu).

> \[!WARNING]
>
> The IP Address Management API is in public beta at this time. This means the API and documentation are still in development and subject to change without advanced notice.

## Operation overview

```json
{"path":"https://api.sendgrid.com/v3/send_ips/pools","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 operation returns a list of your IP Pools and a sample of each Pools' associated IP addresses.

A maximum of 10 IPs will be returned per IP Pool by default. To retrieve additional IP addresses associated with a Pool, use the "Get IPs Assigned to an IP Pool" operation. Each user may have a maximum of 100 IP Pools.

## 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":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Specifies the number of results to be returned by the API. This parameter can be used in combination with the `before_key` or `after_key` parameters to iterate through paginated results.","refName":"#/components/parameters/IpAddressManagementLimit","modelName":"__components_parameters_IpAddressManagementLimit"},{"name":"after_key","in":"query","required":false,"schema":{"type":"integer"},"description":"Specifies which items to be returned by the API. When the `after_key` is specified, the API will return items beginning from the first item after the item specified. This parameter can be used in combination with `limit` to iterate through paginated results.","refName":"#/components/parameters/IpAddressManagementAfterKey","modelName":"__components_parameters_IpAddressManagementAfterKey"},{"name":"ip","in":"query","required":false,"schema":{"type":"string"},"description":"Specifies an IP address. The `ip` query parameter can be used to filter results by IP address.","refName":"#/components/parameters/IpAddressManagementQueryIp","modelName":"__components_parameters_IpAddressManagementQueryIp"},{"name":"region","in":"query","required":false,"description":"Allowed values are `all`, `eu`, and `us`. If you provide a specific region, results will include all pools that have at least one IP in the filtered region. If `all`, pools with at least one IP (regardless of region) will be returned. If the `region` filter is not provided, the query returns all pools, including empty ones.","schema":{"type":"string","enum":["all","eu","us"],"refName":"Region7","modelName":"Region7"},"refName":"#/components/parameters/IpAddressManagementRegion","modelName":"__components_parameters_IpAddressManagementRegion"},{"name":"include_region","in":"query","required":false,"description":"Boolean indicating whether or not to return the IP Pool's region information in the response.","schema":{"type":"boolean","default":false},"refName":"#/components/parameters/IpAddressManagementIncludeRegion","modelName":"__components_parameters_IpAddressManagementIncludeRegion"}]
```

### Responses

```json
[{"responseCode":"200","schema":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"result":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The name of the IP Pool."},"id":{"type":"string","description":"The unique ID of the IP Pool."},"regions":{"type":"array","description":"An array of the unique regions of all the IP addresses returned within the IP pool.","items":{"type":"string","enum":["eu","us"],"refName":"Items","modelName":"Items"}},"ips_preview":{"type":"array","maxItems":10,"description":"A sample list of IP addresses associated with the IP Pool. The sample is limited to 10 results.","items":{"type":"string"}},"total_ip_count":{"type":"integer","description":"The total number of IP addresses in the IP Pool. An IP Pool can have a maximum of 100 associated IP addresses."}}}},"_metadata":{"type":"object","properties":{"next_params":{"type":"object","description":"A collection of fields that can be used to work the endpoint.","properties":{"after_key":{"type":"string","nullable":true,"description":"Specifies which items to be returned by the API. When the `after_key` is specified, the API will return items beginning from the first item after the item specified. This parameter can be used in combination with `limit` to iterate through paginated results. The `after_key` cannot be used in combination with the `before_key` parameter."},"ip":{"type":"string","description":"The IP address specified in the request. This parameter will be returned only if it was specified in the request."},"limit":{"type":"string","description":"The `limit` specified in the request. This parameter will be included only if it was specified in the request. This is not the default limit enforced by the API."},"region":{"type":"string","description":"The region to which the IP address is assigned. This property will only be returned if the `include_region` query parameter is included and set to `true` as part of the API request.","enum":["all","us","eu"],"refName":"Region4","modelName":"Region4"},"include_region":{"type":"string","description":"Indicates whether or not to include the IP address's region. This property will only be returned if the `include_region` query parameter is included and set to `true` as part of the API request."}}}}}}},"examples":{"200":{"value":{"result":[{"name":"transactional_pool","id":"12345","ips_preview":["127.0.0.1","127.0.0.2"],"total_ip_count":2},{"name":"marketing_pool","id":"67890","ips_preview":["127.0.0.3","127.0.0.4","127.0.0.5"],"total_ip_count":3}],"_metadata":{"next_params":{"after_key":null}}}}}},"application/xml":{"schema":{"type":"object","properties":{}}}}}},{"responseCode":"400","schema":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","example-1":{"errors":[{"field":"after_key","message":"must be a numeric value"}]},"description":"IP Address Management Error Response Schema","x-examples":{"example-1":{"errors":[{"field":"after_key","message":"must be a numeric value"}]}},"refName":"IpAddressManagementErrorResponse","modelName":"IpAddressManagementErrorResponse","properties":{"errors":{"type":"array","description":"An array of error objects.","items":{"type":"object","properties":{"field":{"type":"string","description":"Indicates which field caused the error. This may be an empty string if no specific field is responsible for the error."},"message":{"type":"string","description":"An error-specific message that provides more information about the error's cause."}}}}}},"examples":{"400 limit error":{"value":{"errors":[{"field":"limit","message":"should be > 0 and <= 100"}]},"refName":"#/components/examples/IpAddressManagement400LimitValueError","modelName":"__components_examples_IpAddressManagement400LimitValueError"},"400 after_key type error":{"value":{"errors":[{"field":"after_key","message":"must be a numeric value"}]},"refName":"#/components/examples/IpAddressManagement400AfterKeyTypeError","modelName":"__components_examples_IpAddressManagement400AfterKeyTypeError"},"400 after_key value error":{"value":{"errors":[{"field":"after_key","message":"must be >= 0"}]},"refName":"#/components/examples/IpAddressManagement400AfterKeyValueError","modelName":"__components_examples_IpAddressManagement400AfterKeyValueError"}}}}}},{"responseCode":"401","schema":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","example-1":{"errors":[{"field":"after_key","message":"must be a numeric value"}]},"description":"IP Address Management Error Response Schema","x-examples":{"example-1":{"errors":[{"field":"","message":"missing required scope: scope1, scope2"}]}},"refName":"IpAddressManagementErrorResponse","modelName":"IpAddressManagementErrorResponse","properties":{"errors":{"type":"array","description":"An array of error objects.","items":{"type":"object","properties":{"field":{"type":"string","description":"Indicates which field caused the error. This may be an empty string if no specific field is responsible for the error."},"message":{"type":"string","description":"An error-specific message that provides more information about the error's cause."}}}}}},"examples":{"Missing required scope":{"value":{"errors":[{"field":"","message":"missing required scope: scope1, scope2"}]}}}},"application/xml":{"schema":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}}}}},"x-examples":{"example-1":{"errors":[{"field":"","message":"missing required scope: scope1, scope2"}]}}}}},"refName":"#/components/responses/IpAddressManagement401","modelName":"__components_responses_IpAddressManagement401"}},{"responseCode":"500","schema":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","example-1":{"errors":[{"field":"after_key","message":"must be a numeric value"}]},"description":"IP Address Management Error Response Schema","x-examples":{"example-1":{"errors":[{"field":"","message":"internal server error"}]}},"refName":"IpAddressManagementErrorResponse","modelName":"IpAddressManagementErrorResponse","properties":{"errors":{"type":"array","description":"An array of error objects.","items":{"type":"object","properties":{"field":{"type":"string","description":"Indicates which field caused the error. This may be an empty string if no specific field is responsible for the error."},"message":{"type":"string","description":"An error-specific message that provides more information about the error's cause."}}}}}},"examples":{"Generic 500":{"value":{"errors":[{"field":"","message":"internal server error"}]}}}}},"refName":"#/components/responses/IpAddressManagement500","modelName":"__components_responses_IpAddressManagement500"}}]
```

GET all IP Pools that have Associated IPs

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

const request = {
  url: `/v3/send_ips/pools`,
  method: "GET",
};

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"))


response = sg.client.send_ips.pools.get()

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 response =
            await client.RequestAsync(method: SendGridClient.Method.GET, urlPath: "send_ips/pools");

        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("/send_ips/pools");
            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/send_ips/pools", host)
	request.Method = "GET"
	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);

try {
    $response = $sg->client
        ->send_ips()
        ->pools()
        ->get();
    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'])

response = sg.client.send_ips.pools.get()
puts response.status_code
puts response.headers
puts response.body
```

```bash
curl -X GET "https://api.sendgrid.com/v3/send_ips/pools" \
--header "Authorization: Bearer $SENDGRID_API_KEY"
```
