Skip to main content
Pinecone Docs

Search documentation

Type to search this documentation.

On this pageOverview

Manage pod-based indexes

Manage Pinecone pod-based indexes. Pod indexes are legacy and unavailable to new customers, and serverless is recommended for new projects.

This page shows you how to manage pod-based indexes.

For guidance on serverless indexes, see Manage serverless indexes.

Use the describe_index endpoint to get a complete description of a specific index:

Python
from pinecone.grpc import PineconeGRPC as Pinecone

pc = Pinecone(api_key="YOUR_API_KEY")

pc.describe_index(name="docs-example")

# Response:
# {'dimension': 1536,
#  'host': 'docs-example-4mkljsz.svc.aped-4627-b74a.pinecone.io',
#  'metric': 'cosine',
#  'name': 'docs-example',
#  'spec': {'pod': {'environment': 'us-east-1-aws',
#                   'pod_type': 's1.x1',
#                   'pods': 1,
#                   'replicas': 1,
#                   'shards': 1}},
#  'status': {'ready': True, 'state': 'Ready'}}
JavaScript
import { Pinecone } from '@pinecone-database/pinecone';

const pc = new Pinecone({ apiKey: 'YOUR_API_KEY' });

await pc.describeIndex('docs-example');

// Response:
// {
//    "name": "docs-example",
//    "dimension": 1536,
//    "metric": "cosine",
//    "host": "docs-example-4mkljsz.svc.aped-4627-b74a.pinecone.io",
//    "deletionProtection": "disabled",
//    "spec": {
//       "pod": {
//          "environment": "us-east-1-aws",
//          "pod_type": "s1.x1",
//          "pods": 1,
//          "replicas": 1,
//          "shards": 1
//       }
//    },
//    "status": {
//       "ready": true,
//       "state": "Ready"
//    }
// }
Java
import io.pinecone.clients.Pinecone;
import org.openapitools.db_control.client.model.*;

public class DescribeIndexExample {
    public static void main(String[] args) {
        Pinecone pc = new Pinecone.Builder("YOURE_API_KEY").build();
        IndexModel indexModel = pc.describeIndex("docs-example");
        System.out.println(indexModel);
    }
}

// Response:
// class IndexModel {
//     name: docs-example
//     dimension: 1536
//     metric: cosine
//     host: docs-example-4mkljsz.svc.aped-4627-b74a.pinecone.io
//     deletionProtection: disabled
//     spec: class IndexModelSpec {
//         serverless: null
//         pod: class PodSpec {
//             cloud: aws
//             region: us-east-1
//             environment: us-east-1-aws,
//             podType: s1.x1,
//             pods: 1,
//             replicas: 1,
//             shards: 1
//         }
//     }
//     status: class IndexModelStatus {
//         ready: true
//         state: Ready
//     }
// }
Go
package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"

    "github.com/pinecone-io/go-pinecone/v4/pinecone"
)

func prettifyStruct(obj interface{}) string {
    bytes, _ := json.MarshalIndent(obj, "", "  ")
    return string(bytes)
}

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

    pc, err := pinecone.NewClient(pinecone.NewClientParams{
        ApiKey: "YOUR_API_KEY",
    })
    if err != nil {
        log.Fatalf("Failed to create Client: %v", err)
    }

    idx, err := pc.DescribeIndex(ctx, "docs-example")
    if err != nil {
        log.Fatalf("Failed to describe index \"%v\": %v", idx.Name, err)
    } else {
        fmt.Printf("index: %v\n", prettifyStruct(idx))
    }
}

// Response:
// index: {
// 	"name": "docs-example",
// 	"dimension": 1536,
// 	"host": "docs-example-4mkljsz.svc.aped-4627-b74a.pinecone.io",
// 	"metric": "cosine",
//  "deletion_protection": "disabled",
// 	"spec": {
// 	  "pod": {
//       "environment": "us-east-1-aws",
//       "pod_type": "s1.x1",
//       "pods": 1,
//       "replicas": 1,
//       "shards": 1
// 	  }
// 	},
// 	"status": {
// 	  "ready": true,
// 	  "state": "Ready"
// 	}
// }
curl
PINECONE_API_KEY="YOUR_API_KEY"

curl -i -X GET "https://api.pinecone.io/indexes/docs-example" \
    -H "Api-Key: $PINECONE_API_KEY" \
    -H "X-Pinecone-Api-Version: 2025-10"
# Response:
# {
#    "name": "docs-example",
#    "metric": "cosine",
#    "dimension": 1536,
#    "status": {
#       "ready": true,
#       "state": "Ready"
#    },
#    "host": "docs-example-4mkljsz.svc.aped-4627-b74a.pinecone.io",
#    "spec": {
#       "pod": {
#          "environment": "us-east-1-aws",
#          "pod_type": "s1.x1",
#          "pods": 1,
#          "replicas": 1,
#          "shards": 1
#       }
#    }
# }

Use the delete_index operation to delete a pod-based index and all of its associated resources.

Python
# pip install "pinecone[grpc]"
from pinecone.grpc import PineconeGRPC as Pinecone, PodSpec

pc = Pinecone(api_key="YOUR_API_KEY")

pc.delete_index(name="docs-example")
JavaScript
// npm install @pinecone-database/pinecone
import { Pinecone } from '@pinecone-database/pinecone'

const pc = new Pinecone({
  apiKey: 'YOUR_API_KEY'
});

await pc.deleteIndex('docs-example');
Java
import io.pinecone.clients.Pinecone;

public class DeleteIndexExample {
    public static void main(String[] args) {
        Pinecone pc = new Pinecone.Builder("YOUR_API_KEY").build();
        pc.deleteIndex("docs-example");
    }
}
Go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/pinecone-io/go-pinecone/v4/pinecone"
)

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

    pc, err := pinecone.NewClient(pinecone.NewClientParams{
        ApiKey: "YOUR_API_KEY",
    })
    if err != nil {
        log.Fatalf("Failed to create Client: %v", err)
    }

    indexName := "docs-example"

    err = pc.DeleteIndex(ctx, indexName)
    if err != nil {
        log.Fatalf("Failed to delete index: %v", err)
    } else {
        fmt.Println("Index \"%v\" deleted successfully", indexName)
    }
}
curl
PINECONE_API_KEY="YOUR_API_KEY"

curl -i -X DELETE "https://api.pinecone.io/indexes/docs-example" \
  -H "Api-Key: $PINECONE_API_KEY" \
  -H "X-Pinecone-Api-Version: 2025-10"

If deletion protection is enabled on an index, requests to delete it will fail and return a 403 - FORBIDDEN status with the following error:

Deletion protection is enabled for this index. Disable deletion protection before retrying.

Before you can delete such an index, you must first disable deletion protection.

For pod-based indexes, Pinecone indexes all metadata fields by default. When metadata fields contains many unique values, pod-based indexes will consume significantly more memory, which can lead to performance issues, pod fullness, and a reduction in the number of possible vectors that fit per pod.

To avoid indexing high-cardinality metadata that's not needed for filtering your queries and keep memory utilization low, specify which metadata fields to index using the metadata_config parameter.

The value for the metadata_config parameter is a JSON object containing the names of the metadata fields to index.

JSON
{
    "indexed": [
        "metadata-field-1",
        "metadata-field-2",
        "metadata-field-n"
    ]
}

Example

The following example creates a pod-based index that only indexes the genre metadata field. Queries against this index that filter for the genre metadata field may return results; queries that filter for other metadata fields behave as though those fields don't exist.

Python
from pinecone.grpc import PineconeGRPC as Pinecone, PodSpec

pc = Pinecone(api_key="YOUR_API_KEY")

pc.create_index(
  name="docs-example",
  dimension=1536,
  metric="cosine",
  spec=PodSpec(
    environment="us-west1-gcp",
    pod_type="p1.x1",
    pods=1,
    metadata_config = {
      "indexed": ["genre"]
    }
  ),
  deletion_protection="disabled"

)
JavaScript
import { Pinecone } from '@pinecone-database/pinecone'

const pc = new Pinecone({
  apiKey: 'YOUR_API_KEY'
});

await pc.createIndex({
  name: 'docs-example',
  dimension: 1536,
  metric: 'cosine',
  spec: {
    pod: {
      environment: 'us-west1-gcp',
      podType: 'p1.x1',
      pods: 1,
      metadata_config: {
        indexed: ["genre"]
      }
    }
  },
  deletionProtection: 'disabled',
});
Java
import io.pinecone.clients.Pinecone;
import org.openapitools.db_control.client.model.IndexModel;
import org.openapitools.db_control.client.model.DeletionProtection;

public class CreateIndexExample {
    public static void main(String[] args) {
        Pinecone pc = new Pinecone.Builder("YOUR_API_KEY").build();
        CreateIndexRequestSpecPodMetadataConfig podSpecMetadataConfig = new CreateIndexRequestSpecPodMetadataConfig();
        List<String> indexedItems = Arrays.asList("genre", "year");
        podSpecMetadataConfig.setIndexed(indexedItems);
        pc.createPodsIndex("docs-example", 1536, "us-west1-gcp",
                "p1.x1", "cosine", podSpecMetadataConfig, DeletionProtection.DISABLED);
    }
}
Go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/pinecone-io/go-pinecone/v4/pinecone"
)

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

    pc, err := pinecone.NewClient(pinecone.NewClientParams{
        ApiKey: "YOUR_API_KEY",
    })
    if err != nil {
        log.Fatalf("Failed to create Client: %v", err)
    }

    podIndexMetadata := &pinecone.PodSpecMetadataConfig{
        Indexed: &[]string{"genre"},
    }

    indexName := "docs-example"
  	metric := pinecone.Dotproduct
	deletionProtection := pinecone.DeletionProtectionDisabled

	idx, err := pc.CreatePodIndex(ctx, &pinecone.CreatePodIndexRequest{
        Name:               indexName,
        Metric:             &metric,
        Dimension:          1536,
        Environment:        "us-east1-gcp",
        PodType:            "p1.x1",
        DeletionProtection: &deletionProtection,
  	})
  	if err != nil {
        log.Fatalf("Failed to create pod-based index: %v", idx.Name)
    } else {
        fmt.Printf("Successfully created pod-based index: %v", idx.Name)
    }
}
curl
PINECONE_API_KEY="YOUR_API_KEY"

curl -s https://api.pinecone.io/indexes \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "Api-Key: $PINECONE_API_KEY" \
  -H "X-Pinecone-Api-Version: 2025-10" \
  -d '{
         "name": "docs-example",
         "dimension": 1536,
         "metric": "cosine",
         "spec": {
            "pod": {
               "environment": "us-west1-gcp",
               "pod_type": "p1.x1",
               "pods": 1,
               "metadata_config": {
                  "indexed": ["genre"]
               }
            }
         },
         "deletion_protection": "disabled"
      }'

You can prevent an index and its data from accidental deleting when creating a new index or when configuring an existing index. In both cases, you set the deletion_protection parameter to enabled.

To enable deletion protection when creating a new index:

Python
# pip install "pinecone[grpc]"
from pinecone.grpc import PineconeGRPC as Pinecone, PodSpec

pc = Pinecone(api_key="YOUR_API_KEY")

pc.create_index(
  name="docs-example",
  dimension=1536,
  metric="cosine",
  spec=PodSpec(
    environment="us-west1-gcp",
    pod_type="p1.x1",
    pods=1
  ),
    deletion_protection="enabled"
)
JavaScript
import { Pinecone } from '@pinecone-database/pinecone'

const pc = new Pinecone({
  apiKey: 'YOUR_API_KEY'
});

await pc.createIndex({
  name: 'docs-example',
  dimension: 1536,
  metric: 'cosine',
  spec: {
    pod: {
      environment: 'us-west1-gcp',
      podType: 'p1.x1',
      pods: 1
    }
  },
  deletionProtection: 'enabled',
});
Java
import io.pinecone.clients.Pinecone;
import org.openapitools.db_control.client.model.IndexModel;
import org.openapitools.db_control.client.model.DeletionProtection;

public class CreateIndexExample {
    public static void main(String[] args) {
        Pinecone pc = new Pinecone.Builder("YOUR_API_KEY").build();
        pc.createPodsIndex("docs-example", 1536, "us-west1-gcp",
                "p1.x1", "cosine", DeletionProtection.ENABLED);
    }
}
Go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/pinecone-io/go-pinecone/v4/pinecone"
)

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

    pc, err := pinecone.NewClient(pinecone.NewClientParams{
        ApiKey: "YOUR_API_KEY",
    })
    if err != nil {
        log.Fatalf("Failed to create Client: %v", err)
    }

    indexName := "docs-example"
  	metric := pinecone.Dotproduct
	deletionProtection := pinecone.DeletionProtectionDisabled

	idx, err := pc.CreatePodIndex(ctx, &pinecone.CreatePodIndexRequest{
        Name:               indexName,
        Metric:             &metric,
        Dimension:          1536,
        Environment:        "us-east1-gcp",
        PodType:            "p1.x1",
        DeletionProtection: &deletionProtection,
  	})
  	if err != nil {
        log.Fatalf("Failed to create pod-based index: %v", idx.Name)
    } else {
        fmt.Printf("Successfully created pod-based index: %v", idx.Name)
    }
}
curl
PINECONE_API_KEY="YOUR_API_KEY"

curl -s "https://api.pinecone.io/indexes" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "Api-Key: $PINECONE_API_KEY" \
  -H "X-Pinecone-Api-Version: 2025-10" \
  -d '{
         "name": "docs-example",
         "dimension": 1536,
         "metric": "cosine",
         "spec": {
            "pod": {
               "environment": "us-west1-gcp",
               "pod_type": "p1.x1",
               "pods": 1
            }
         },
         "deletion_protection": "enabled"
      }'

To enable deletion protection when configuring an existing index:

Python
from pinecone.grpc import PineconeGRPC as Pinecone

pc = Pinecone(api_key="YOUR_API_KEY")

pc.configure_index(
   name="docs-example", 
   deletion_protection="enabled"
)
JavaScript
import { Pinecone } from '@pinecone-database/pinecone';

const client = new Pinecone({ apiKey: 'YOUR_API_KEY' });

await client.configureIndex('docs-example', { deletionProtection: 'enabled' });
Java
import io.pinecone.clients.Pinecone;
import org.openapitools.db_control.client.model.*;

public class ConfigureIndexExample {
    public static void main(String[] args) {
        Pinecone pc = new Pinecone.Builder("YOUR_API_KEY").build();
        pc.configurePodsIndex("docs-example", DeletionProtection.ENABLED);
    }
}
Go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/pinecone-io/go-pinecone/v4/pinecone"
)

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

    pc, err := pinecone.NewClient(pinecone.NewClientParams{
        ApiKey: "YOUR_API_KEY",
    })
    if err != nil {
        log.Fatalf("Failed to create Client: %v", err)
    }

    idx, err := pc.ConfigureIndex(ctx, "docs-example", pinecone.ConfigureIndexParams{DeletionProtection: "enabled"})
  	if err != nil {
        log.Fatalf("Failed to configure index \"%v\": %v", idx.Name, err)
    } else {
        fmt.Printf("Successfully configured index \"%v\"", idx.Name)
    }
}
curl
PINECONE_API_KEY="YOUR_API_KEY"

curl -s -X PATCH "https://api.pinecone.io/indexes/docs-example" \
    -H "Content-Type: application/json" \
    -H "Api-Key: $PINECONE_API_KEY" \
    -H "X-Pinecone-Api-Version: 2025-10" \
    -d '{
        "deletion_protection": "enabled"
        }'

When deletion protection is enabled on an index, requests to delete the index fail and return a 403 - FORBIDDEN status with the following error:

Deletion protection is enabled for this index. Disable deletion protection before retrying.

Before you can delete an index with deletion protection enabled, you must first disable deletion protection as follows:

Python
from pinecone.grpc import PineconeGRPC as Pinecone

pc = Pinecone(api_key="YOUR_API_KEY")

pc.configure_index(
   name="docs-example", 
   deletion_protection="disabled"
)
JavaScript
import { Pinecone } from '@pinecone-database/pinecone';

const client = new Pinecone({ apiKey: 'YOUR_API_KEY' });

await client.configureIndex('docs-example', { deletionProtection: 'disabled' });
Java
import io.pinecone.clients.Pinecone;
import org.openapitools.db_control.client.model.*;

public class ConfigureIndexExample {
    public static void main(String[] args) {
        Pinecone pc = new Pinecone.Builder("YOUR_API_KEY").build();
        pc.configurePodsIndex("docs-example", DeletionProtection.DISABLED);
    }
}
Go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/pinecone-io/go-pinecone/v4/pinecone"
)

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

    pc, err := pinecone.NewClient(pinecone.NewClientParams{
        ApiKey: "YOUR_API_KEY",
    })
    if err != nil {
        log.Fatalf("Failed to create Client: %v", err)
    }

    idx, err := pc.ConfigureIndex(ctx, "docs-example", pinecone.ConfigureIndexParams{DeletionProtection: "disabled"})
  	if err != nil {
        log.Fatalf("Failed to configure index \"%v\": %v", idx.Name, err)
    } else {
        fmt.Printf("Successfully configured index \"%v\"", idx.Name)
    }
}
curl
PINECONE_API_KEY="YOUR_API_KEY"

curl -s -X PATCH "https://api.pinecone.io/indexes/docs-example" \
    -H "Content-Type: application/json" \
    -H "Api-Key: $PINECONE_API_KEY" \
    -H "X-Pinecone-Api-Version: 2025-10" \
    -d '{
        "deletion_protection": "disabled"
        }'

In pod-based indexes, reads and writes share compute resources, so deleting an entire namespace with many records can increase the latency of read operations. In such cases, consider deleting records in batches.

In pod-based indexes, reads and writes share compute resources, so deleting an entire namespace or a large number of records can increase the latency of read operations. To avoid this, delete records in batches of up to 1000, with a brief sleep between requests. Consider using smaller batches if the index has active read traffic.

Batch
from pinecone import Pinecone
import numpy as np
import time

pc = Pinecone(api_key='API_KEY')

INDEX_NAME = 'INDEX_NAME'
NAMESPACE = 'NAMESPACE_NAME'
# Consider using smaller batches if you have a high RPS for read operations
BATCH = 1000

index = pc.Index(name=INDEX_NAME)
dimensions = index.describe_index_stats()['dimension']

# Create the query vector
query_vector = np.random.uniform(-1, 1, size=dimensions).tolist()
results = index.query(vector=query_vector, namespace=NAMESPACE, top_k=BATCH)

# Delete in batches until the query returns no results
while len(results['matches']) > 0:
    ids = [i['id'] for i in results['matches']]
    index.delete(ids=ids, namespace=NAMESPACE)
    time.sleep(0.01)
    results = index.query(vector=query_vector, namespace=NAMESPACE, top_k=BATCH)
Batch
from pinecone import Pinecone
import numpy as np
import time

pc = Pinecone(api_key='API_KEY')

INDEX_NAME = 'INDEX_NAME'
NAMESPACE = 'NAMESPACE_NAME'
# Consider using smaller batches if you have a high RPS for read operations
BATCH = 1000

index = pc.Index(name=INDEX_NAME)
dimensions = index.describe_index_stats()['dimension']

METADATA_FILTER = {}

# Create the query vector with a filter
query_vector = np.random.uniform(-1, 1, size=dimensions).tolist()
results = index.query(vector=query_vector, namespace=NAMESPACE, filter=METADATA_FILTER, top_k=BATCH)

# Delete in batches until the query returns no results
while len(results['matches']) > 0:
    ids = [i['id'] for i in results['matches']]
    index.delete(ids=ids, namespace=NAMESPACE)
    time.sleep(0.01)
    results = index.query(vector=query_vector, namespace=NAMESPACE, filter=METADATA_FILTER, top_k=BATCH)

To delete records from a namespace based on their metadata values, pass a metadata filter expression to the delete operation. This deletes all records in the namespace that match the filter expression.

For example, the following code deletes all records with a genre field set to documentary from namespace example-namespace:

Python
# pip install "pinecone[grpc]"
from pinecone.grpc import PineconeGRPC as Pinecone

pc = Pinecone(api_key="YOUR_API_KEY")

# To get the unique host for an index, 
# see https://docs.pinecone.io/guides/manage-data/target-an-index
index = pc.Index(host="INDEX_HOST")

index.delete(
    filter={
        "genre": {"$eq": "documentary"}
    },
    namespace="example-namespace" 
)
JavaScript
import { Pinecone } from '@pinecone-database/pinecone'

const pc = new Pinecone({ apiKey: "YOUR_API_KEY" })

// To get the unique host for an index, 
// see https://docs.pinecone.io/guides/manage-data/target-an-index
const index = pc.index("INDEX_NAME", "INDEX_HOST")

const ns = index.namespace('example-namespace')

await ns.deleteMany({
  genre: { $eq: "documentary" },
});
Java
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import io.pinecone.clients.Index;
import io.pinecone.configs.PineconeConfig;
import io.pinecone.configs.PineconeConnection;

import java.util.Arrays;
import java.util.List;

public class DeleteExample {
    public static void main(String[] args) {
        PineconeConfig config = new PineconeConfig("YOUR_API_KEY");
        // To get the unique host for an index, 
        // see https://docs.pinecone.io/guides/manage-data/target-an-index
        config.setHost("INDEX_HOST");
        PineconeConnection connection = new PineconeConnection(config);
        Index index = new Index(connection, "INDEX_NAME");
        Struct filter = Struct.newBuilder()
                .putFields("genre", Value.newBuilder()
                        .setStructValue(Struct.newBuilder()
                                .putFields("$eq", Value.newBuilder()
                                        .setStringValue("documentary")
                                        .build()))
                        .build())
                .build();
        index.deleteByFilter(filter, "example-namespace");

    }
}
Go
package main

import (
    "context"
    "log"

    "github.com/pinecone-io/go-pinecone/v4/pinecone"
)

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

    pc, err := pinecone.NewClient(pinecone.NewClientParams{
        ApiKey: "YOUR_API_KEY",
    })
    if err != nil {
        log.Fatalf("Failed to create Client: %v", err)
    }

    // To get the unique host for an index, 
    // see https://docs.pinecone.io/guides/manage-data/target-an-index
    idxConnection, err := pc.Index(pinecone.NewIndexConnParams{Host: "INDEX_HOST", Namespace: "example-namespace"})
    if err != nil {
        log.Fatalf("Failed to create IndexConnection for Host: %v", err)
  	}

    metadataFilter := map[string]interface{}{
		"genre": map[string]interface{}{
			"$eq": "documentary",
		},
    }

    filter, err := structpb.NewStruct(metadataFilter)
    if err != nil {
        log.Fatalf("Failed to create metadata filter: %v", err)
    }

    err = idxConnection.DeleteVectorsByFilter(ctx, filter)
    if err != nil {
        log.Fatalf("Failed to delete vector(s) with filter %+v: %v", filter, err)
    }
}
curl
# To get the unique host for an index,
# see https://docs.pinecone.io/guides/manage-data/target-an-index
PINECONE_API_KEY="YOUR_API_KEY"
INDEX_HOST="INDEX_HOST"

curl -i "https://$INDEX_HOST/vectors/delete" \
  -H "Api-Key: $PINECONE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "X-Pinecone-Api-Version: 2026-07" \
  -d '{
    "filter": {"genre": {"$eq": "documentary"}},
    "namespace": "example-namespace"
  }'

When configuring an index, you can tag the index to help with index organization and management. For more details, see Tag an index.

To control costs, project owners can set the maximum total number of pods allowed across all pod-based indexes in a project. The default pod limit is 5.

  1. Go to Settings > Projects.
  2. For the project you want to update, click the ellipsis (...) menu > Configure.
  3. In the Pod Limit section, update the number of pods.
  4. Click Save Changes.
curl
PINECONE_ACCESS_TOKEN="YOUR_ACCESS_TOKEN"
PROJECT_ID="YOUR_PROJECT_ID"

curl -X PATCH "https://api.pinecone.io/admin/projects/$PROJECT_ID" \
  -H "accept: application/json" \
  -H "Content-Type: application/json" \
	-H "X-Pinecone-Api-Version: 2025-10" \
  -d '{
    "max_pods": 5
    }'

The example returns a response like the following:

JSON
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "name": "example-project",
  "max_pods": 5,
  "force_encryption_with_cmek": false,
  "organization_id": "string",
  "created_at": "2025-03-17T00:42:31.912Z"
}

For each pod-based index, billing is determined by the per-minute price per pod and the number of pods the index uses, regardless of index activity. When a pod-based index isn't in use, back it up using collections and delete the inactive index. When you're ready to use the vectors again, you can create a new index from the collection. This new index can also use a different index type or size. Because it's relatively cheap to store collections, you can reduce costs by only running an index when it's in use.

Pod sizes are designed for different applications, and some are more expensive than others. Choose the appropriate pod type and size, so you pay for the resources you need. For example, the s1 pod type provides large storage capacity and lower overall costs with slightly higher query latencies than p1 pods. By switching to a different pod type, you may be able to reduce costs while still getting the performance your application needs.

Pinecone generates time-series performance metrics for each Pinecone index. You can monitor these metrics directly in the Pinecone console or with tools like Prometheus or Datadog.

To view performance metrics in the Pinecone console:

  1. Open the Pinecone console.
  2. Select the project containing the index you want to monitor.
  3. Go to Database > Indexes.
  4. Select the index.
  5. Go to the Metrics tab.

To monitor Pinecone with Datadog, use Datadog's Pinecone integration.

To monitor all pod-based indexes in a specific region of a project, insert the following snippet into the scrape_configs section of your prometheus.yml file and update it with values for your Prometheus integration:

YAML
scrape_configs:
  - job_name: "pinecone-pod-metrics"
    scheme: https
    metrics_path: '/metrics'
    authorization:
      credentials: API_KEY
    static_configs:
      - targets: ["metrics.ENVIRONMENT.pinecone.io" ]
  • Replace API_KEY with an API key for the project you want to monitor. If necessary, you can create an new API key in the Pinecone console.

  • Replace ENVIRONMENT with the environment of the pod-based indexes you want to monitor.

For more configuration details, see the Prometheus docs.

The following metrics are available when you integrate Pinecone with Prometheus:

Name Type Description
pinecone_vector_count gauge The number of records per pod in the index.
pinecone_request_count_total counter The number of data plane calls made by clients.
pinecone_request_error_count_total counter The number of data plane calls made by clients that resulted in errors.
pinecone_request_latency_seconds histogram The distribution of server-side processing latency for pinecone data plane calls.
pinecone_index_fullness gauge The fullness of the index on a scale of 0 to 1.

Each metric contains the following labels:

Label Description
pid Process identifier.
index_name Name of the index to which the metric applies.
project_name Name of the project containing the index.
request_type Type of request: upsert, delete, fetch, query, or describe_index_stats. This label is included only in pinecone_request_* metrics.

Return the average latency in seconds for all requests against the Pinecone index docs-example:

Shell
avg by (request_type) (pinecone_request_latency_seconds{index_name="docs-example"})

Return the vector count for the Pinecone index docs-example:

Shell
sum ((avg by (app) (pinecone_vector_count{index_name="docs-example"})))

Return the total number of requests against the Pinecone index docs-example over one minute:

Shell
sum by (request_type)(increase(pinecone_request_count_total{index_name="docs-example"}[60s]))

Return the total number of upsert requests against the Pinecone index docs-example over one minute:

Shell
sum by (request_type)(increase(pinecone_request_count_total{index_name="docs-example", request_type="upsert"}[60s]))

Return the total errors returned by the Pinecone index docs-example over one minute:

Shell
sum by (request_type) (increase(pinecone_request_error_count{
      index_name="docs-example"}[60s]))

Return the index fullness metric for the Pinecone index docs-example:

round(max (pinecone_index_fullness{index_name="docs-example"} * 100))

Serverless indexes automatically scale as needed.

However, pod-based indexes can run out of capacity. When that happens, upserting new records will fail with the following error:

console
Index is full, cannot accept data.

High-cardinality metadata and over-provisioning

Section titled “High-cardinality metadata and over-provisioning”

This Loom video walkthrough shows you how to manage two scenarios:

  • The first scenario involves customers loading an index replete with high cardinality metadata. This can trigger a series of unforeseen challenges, and hence, it's vital to comprehend how to manage this situation effectively. This methodology can be applied whenever you need to change your metadata configuration.

  • The second scenario that we will address involves customers who have over-provisioned the number of pods they need. More specifically, we will discuss the process of re-scaling an index in instances where the customer has previously scaled vertically and now desires to scale the index back down.

Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu