Skip to content
Cloudflare Docs

Read key-value pairs

To get the value for a given key, call the get() method of the KV binding on any KV namespace you have bound to your Worker code:

// Read individual key
env.NAMESPACE.get(key);
// Read multiple keys
env.NAMESPACE.get(keys);

The get() method returns a promise you can await on to get the value.

If you request a single key as a string, you will get a single response in the promise. If the key is not found, the promise will resolve with the literal value null.

You can also request an array of keys. The return value with be a Map of the key-value pairs found, with keys not found having null values.

export default {
async fetch(request, env, ctx) {
try {
// Read single key, returns value or null
const value = await env.NAMESPACE.get("first-key");
// Read multiple keys, returns Map of values
const values = await env.NAMESPACE.get(["first-key", "second-key"]);
// Read single key with metadata, returns value or null
const valueWithMetadata = await env.NAMESPACE.getWithMetadata("first-key");
// Read multiple keys with metadata, returns Map of values
const valuesWithMetadata = await env.NAMESPACE.getWithMetadata(["first-key", "second-key"]);
return new Response({
value: value,
values: Object.fromEntries(values),
valueWithMetadata: valueWithMetadata,
valuesWithMetadata: Object.fromEntries(valuesWithMetadata)
});
} catch (e) {
return new Response(e.message, { status: 500 });
}
},
};

Reference

The following methods are provided to read from KV:

get() method

Use the get() method to get a single value, or multiple values if given multiple keys:

Request a single key with get(key: string)

To get the value for a single key, call the get() method on any KV namespace you have bound to your Worker code with:

env.NAMESPACE.get(key, type?);
// OR
env.NAMESPACE.get(key, options?);
Parameters
  • key: string
    • The key of the KV pair.
  • type: "text" | "json" | "arrayBuffer" | "stream"
    • Optional. The type of the value to be returned. text is the default.
  • options: { cacheTtl?: number, type?: "text" | "json" | "arrayBuffer" | "stream" }
    • Optional. Object containing the optional cacheTtl and type properties. The cacheTtl property defines the length of time in seconds that a KV result is cached in the global network location it is accessed from (minimum: 60). The type property defines the type of the value to be returned.
Response
  • response: Promise<string | Object | ArrayBuffer | ReadableStream | null>
    • The value for the requested KV pair. The response type will depend on the type parameter provided for the get() command as follows:

Request multiple keys with get(keys: string[])

To get the values for multiple keys, call the get() method on any KV namespace you have bound to your Worker code with:

env.NAMESPACE.get(keys, type?);
// OR
env.NAMESPACE.get(keys, options?);
Parameters
  • keys: string[]
    • The keys of the KV pairs. Max: 100 keys
  • type: "text" | "json"
    • Optional. The type of the value to be returned. text is the default.
  • options: { cacheTtl?: number, type?: "text" | "json" }
    • Optional. Object containing the optional cacheTtl and type properties. The cacheTtl property defines the length of time in seconds that a KV result is cached in the global network location it is accessed from (minimum: 60). The type property defines the type of the value to be returned.
Response
  • response: Promise<Map<string, string | Object | null>>
    • The value for the requested KV pair. If no key is found, null is returned for the key. The response type will depend on the type parameter provided for the get() command as follows:
      • text: A string (default).
      • json: An object decoded from a JSON string.

The limit of the response size is 25 MB. Responses above this size will fail with a 413 Error error message.

getWithMetadata() method

Use the getWithMetadata() method to get a single value along with its metadata, or multiple values with their metadata:

Request a single key with getWithMetadata(key: string)

To get the value for a given key along with its metadata, call the getWithMetadata() method on any KV namespace you have bound to your Worker code:

env.NAMESPACE.getWithMetadata(key, type?);
// OR
env.NAMESPACE.getWithMetadata(key, options?);

Metadata is a serializable value you append to each KV entry.

Parameters
  • key: string
    • The key of the KV pair.
  • type: "text" | "json" | "arrayBuffer" | "stream"
    • Optional. The type of the value to be returned. text is the default.
  • options: { cacheTtl?: number, type?: "text" | "json" | "arrayBuffer" | "stream" }
    • Optional. Object containing the optional cacheTtl and type properties. The cacheTtl property defines the length of time in seconds that a KV result is cached in the global network location it is accessed from (minimum: 60). The type property defines the type of the value to be returned.
Response
  • response: Promise<{ value: string | Object | ArrayBuffer | ReadableStream | null, metadata: string | null }>

    • An object containing the value and the metadata for the requested KV pair. The type of the value attribute will depend on the type parameter provided for the getWithMetadata() command as follows:

If there is no metadata associated with the requested key-value pair, null will be returned for metadata.

Request multiple keys with getWithMetadata(keys: string[])

To get the values for a given set of keys along with their metadata, call the getWithMetadata() method on any KV namespace you have bound to your Worker code with:

env.NAMESPACE.getWithMetadata(keys, type?);
// OR
env.NAMESPACE.getWithMetadata(keys, options?);
Parameters
  • keys: string[]
    • The keys of the KV pairs. Max: 100 keys
  • type: "text" | "json"
    • Optional. The type of the value to be returned. text is the default.
  • options: { cacheTtl?: number, type?: "text" | "json" }
    • Optional. Object containing the optional cacheTtl and type properties. The cacheTtl property defines the length of time in seconds that a KV result is cached in the global network location it is accessed from (minimum: 60). The type property defines the type of the value to be returned.
Response
  • response: Promise<Map<string, { value: string | Object | null, metadata: string | Object | null }>

    • An object containing the value and the metadata for the requested KV pair. The type of the value attribute will depend on the type parameter provided for the getWithMetadata() command as follows:
      • text: A string (default).
      • json: An object decoded from a JSON string.
    • The type of the metadata will just depend on what is stored, which can be either a string or an object.

If there is no metadata associated with the requested key-value pair, null will be returned for metadata.

The limit of the response size is 25 MB. Responses above this size will fail with a 413 Error error message.

Guidance

Type parameter

For simple values, use the default text type which provides you with your value as a string. For convenience, a json type is also specified which will convert a JSON value into an object before returning the object to you. For large values, use stream to request a ReadableStream. For binary values, use arrayBuffer to request an ArrayBuffer.

For large values, the choice of type can have a noticeable effect on latency and CPU usage. For reference, the type can be ordered from fastest to slowest as stream, arrayBuffer, text, and json.

CacheTtl parameter

cacheTtl is a parameter that defines the length of time in seconds that a KV result is cached in the global network location it is accessed from.

Defining the length of time in seconds is useful for reducing cold read latency on keys that are read relatively infrequently. cacheTtl is useful if your data is write-once or write-rarely.

cacheTtl is not recommended if your data is updated often and you need to see updates shortly after they are written, because writes that happen from other global network locations will not be visible until the cached value expires.

The cacheTtl parameter must be an integer greater than or equal to 60, which is the default.

The effective cacheTtl of an already cached item can be reduced by getting it again with a lower cacheTtl. For example, if you did NAMESPACE.get(key, {cacheTtl: 86400}) but later realized that caching for 24 hours was too long, you could NAMESPACE.get(key, {cacheTtl: 300}) or even NAMESPACE.get(key) and it would check for newer data to respect the provided cacheTtl, which defaults to 60 seconds.

Other methods to access KV

You can read key-value pairs from the command line with Wrangler and from the REST API.