---
title:  Region Endpoints
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

A <%=vars.product_name%> region is how <%=vars.product_name%> logically groups data within its cache. Regions stores data as entries, which are key-value pairs. Using the REST APIs you can read, add (or update), and delete region data.

See also [Data Regions](../basic_config/data_regions/chapter_overview.html#data_regions) for more information on working with regions.

-   **[GET /geode/v1](get_regions.html)**

    List all available resources (regions) in the <%=vars.product_name%> cluster.

-   **[GET /geode/v1/{region}](get_region_data.html)**

    Read data for the region. The optional limit URL query parameter specifies the number of values from the Region that will be returned. The default limit is 50. If the user specifies a limit of “ALL”, then all entry values for the region will be returned.

-   **[GET /geode/v1/{region}/keys](get_region_keys.html)**

    List all keys for the specified region.

-   **[GET /geode/v1/{region}/{key}](get_region_key_data.html)**

    Read data for a specific key in the region.

-   **[GET /geode/v1/{region}/{key1},{key2},...,{keyN}](get_region_data_for_multiple_keys.html)**

    Read data for multiple keys in the region.

-   **[HEAD /geode/v1/{region}](head_region_size.html)**

    An HTTP HEAD request that returns region's size (number of entries) within the HEADERS, which is a response without the content-body. Region size is specified in the pre-defined header named "Resource-Count".

-   **[POST /geode/v1/{region}?key=&lt;key&gt;](post_if_absent_data.html)**

    Create (put-if-absent) data in region.

-   **[PUT /geode/v1/{region}/{key}](put_update_data.html)**

    Update or insert (put) data for key in region.

-   **[PUT /geode/v1/{region}/{key1},{key2},...{keyN}](put_multiple_values_for_keys.html)**

    Update or insert (put) data for multiple keys in the region.

-   **[PUT /geode/v1/{region}/{key}?op=REPLACE](put_replace_data.html)**

    Update (replace) data with key(s) if and only if the key(s) exists in region. The Key(s) must be present in the Region for the update to occur.

-   **[PUT /geode/v1/{region}/{key}?op=CAS](put_update_cas_data.html)**

    Update (compare-and-set) value having key with a new value if and only if the "@old" value sent matches the current value having key in region.

-   **[DELETE /geode/v1/{region}](delete_all_data.html)**

    Delete all entries in the region.

-   **[DELETE /geode/v1/{region}/{key}](delete_data_for_key.html)**

    Delete entry for specified key in the region.

-   **[DELETE /geode/v1/{region}/{key1},{key2},...{keyN}](delete_data_for_multiple_keys.html)**

    Delete entries for multiple keys in the region.


