Source: https://developers.woosmap.com/products/indoor-api/features/feature-details/

> For clean Markdown of any page, append `.md` to the page URL.

> For a complete documentation index, see https://developers.woosmap.com/llms.txt

# Get Feature Details



**Most integrations should use a client library.** The [Map JS API](/products/indoor-api/indoor-js-api/reference/) and [mobile SDKs](/products/mobile/get-started/) handle authentication, map binding, and error handling automatically. Call the REST API directly only when building a backend service or a platform where the JS library is unavailable.

## What is the Get Feature Details Endpoint?

Retrieves complete information about a specific POI, including precise coordinates, floor level, building location, and metadata, using its unique identifier.

## When to Use This Endpoint

This endpoint is the step after Autocomplete or Search: once you have a POI identifier, Details retrieves the full GeoJSON feature with precise coordinates, floor level, and all metadata. Use it to populate a detail panel, resolve a deep link to a specific indoor location, set a navigation destination, or sync POI data with an external system.

## API Endpoint

```http
GET https://api.woosmap.com/indoor/venues/{venueId}/pois/{featureId}
```

### Authentication

Authenticate using either a `key` (public API key for client-side requests) or `private_key` (for server-side requests).
Public keys require domain/IP restrictions, while private keys should be kept secret and never exposed in client code.
You can also use the `X-Api-Key` header for server-side or mobile authentication.

```bash
# Client-side (query parameter)
?key=YOUR_PUBLIC_KEY

# Server-side (query parameter)
?private_key=YOUR_PRIVATE_KEY

# Server-side / Mobile (header)
-H "X-Api-Key: YOUR_PRIVATE_KEY"
```

For complete authentication details and security best practices, see [API Keys Documentation](/api-reference/authentication/).

## Request Parameters Overview

### Path Parameters

| Parameter   | Type   | Description                                                                      |
| ----------- | ------ | -------------------------------------------------------------------------------- |
| `venueId`   | string | The unique identifier for the indoor venue                                       |
| `featureId` | string | The unique identifier for the POI. Accepts `pk`, `id`, or `ref:` prefixed values |

### Required Query Parameters

| Parameter              | Type   | Description          |
| ---------------------- | ------ | -------------------- |
| `key` or `private_key` | string | Your Woosmap API key |

### Key Optional Parameters

| Parameter  | Type   | Description                                            |
| ---------- | ------ | ------------------------------------------------------ |
| `language` | string | Language code for localized results (e.g., "en", "fr") |

### Request Example

```bash
GET https://api.woosmap.com/indoor/venues/gdn_doc/pois/614309?key=YOUR_API_KEY
```

```javascript
const response = await fetch(`https://api.woosmap.com/indoor/venues/${venueId}/pois/${featureId}?key=YOUR_API_KEY`);
const feature = await response.json();
```

Using a reference identifier:

```bash
GET https://api.woosmap.com/indoor/venues/gdn_doc/pois/ref:bakery001?key=YOUR_API_KEY
```

## Response Format

The API returns a standard GeoJSON Feature object containing the POI's geometry (coordinates) and properties (name, level, building, category, custom metadata, etc.).

### Response Fields

| Field                    | Type    | Description                                |
| ------------------------ | ------- | ------------------------------------------ |
| `type`                   | string  | GeoJSON type, always "Feature"             |
| `id`                     | string  | Unique identifier of the feature           |
| `geometry.type`          | string  | Geometry type (typically "Point" for POIs) |
| `geometry.coordinates`   | array   | `[longitude, latitude]` coordinates        |
| `properties.pk`          | number  | Primary key identifier                     |
| `properties.ref`         | string  | Custom reference identifier (if assigned)  |
| `properties.name`        | string  | Display name of the POI                    |
| `properties.level`       | integer | Floor level where the feature is located   |
| `properties.building_id` | string  | Building identifier                        |
| `properties.venue_id`    | string  | Parent venue identifier                    |
| `properties.category`    | string  | Main category classification               |
| `properties.subcategory` | string  | Specific subcategory                       |
| `properties.description` | string  | Detailed description text                  |
| `properties.tags`        | object  | Additional key-value metadata              |

### Status Codes

- `OK`: Request successful, feature returned
- `NOT_FOUND`: No feature found with the specified identifier
- `INVALID_REQUEST`: Missing or invalid parameters
- `REQUEST_DENIED`: Invalid API key or unauthorized access
- `OVER_QUERY_LIMIT`: Rate limit exceeded

## Implementation Notes

Prefer `ref` identifiers over numeric `pk` or `id` values when you control the calling code — refs are stable across venue data updates, whereas internal IDs can change if a POI is recreated. Feature details change rarely, so caching responses for the duration of a session is safe and reduces latency for repeated lookups. Always read the `level` property from the response before calling `indoorRenderer.setFloor()`, since a deep link or external reference may point to a floor the map isn't currently showing.

## Usage with Map JS API

```javascript
// Using Indoor Service to get feature details and highlight on map
const indoorService = new window.woosmap.map.IndoorService();
const indoorRenderer = new woosmap.map.IndoorRenderer({
  venue: "gdn_doc",
  centerMap: true,
});
indoorRenderer.setMap(map);

indoorService.feature(
  "gdn_doc", // venueId
  614309, // featureId (integer)
  (feature) => {
    // Switch to the correct floor, then highlight the POI
    indoorRenderer.setFloor(feature.properties.level);
    indoorRenderer.highlightFeature(feature.id.toString(), false);
  }
);
```
