# Emotion distribution

- Method: `GET`
- Path: `/emotions`
- Tier: Pro
- HTML docs: https://docs.hiddensystems.ai/nebula/reference/get-emotions/
- Interactive docs: https://docs.hiddensystems.ai/nebula/api/#endpoint=get-emotions

## Description

Returns post counts and within-bucket proportions for each detected emotion for exactly one resolved asset or non-asset subject. Asset selectors support equities, commodities, indices, and crypto assets returned by GET /assets; commodity and index IDs use asset_class=equity. Parameter rules: One of asset_id or subject_id is required. asset_id requires asset_class. subject_id and asset_class cannot be combined. subject_id and asset_id cannot be combined.

## cURL Example

```bash
curl --get \
  --url 'https://nebula-api.hiddensystems.ai/api/v1/public/emotions' \
  --data-urlencode 'asset_id=NVDA' \
  --data-urlencode 'asset_class=equity' \
  --header 'X-API-Key: YOUR_API_KEY'
```

## Path Parameters

No path parameters for this endpoint.

## Query Parameters

- `asset_id` (string, optional): Canonical identifier returned by /assets. Stock, commodity, and index IDs are normally ticker or market symbols and use asset_class=equity; crypto IDs are canonical crypto slugs. asset_class is mandatory whenever asset_id is present.
- `asset_class` (string, optional, allowed: equity, crypto): Namespace of asset_id, or the market class for endpoints with a class-scoped global view. Stocks, commodities, and indices use equity. Equity is the documented default only where the endpoint description states a default.
- `subject_id` (string, optional): Canonical non-asset identifier returned by /subjects. It cannot be combined with asset_id or asset_class.
- `hours` (integer, optional, default: 720): Lookback window in hours.
- `granularity` (string, optional, allowed: 1h, 2h, 4h, 12h, 1d): Requested time-series bucket size. When omitted, the service chooses a bucket size appropriate for the lookback window.

## Response

OK

- `metadata` (object): Methodology and request-window metadata needed to interpret the response.
- `metadata.empty_bucket_policy` (string, required): How clients should interpret buckets omitted or emitted without data.
- `metadata.empty_buckets` (integer, required): Number of buckets with no qualifying data.
- `metadata.granularity` (string, required): Time bucket size used by the returned series.
- `metadata.hours` (integer, required): Lookback window represented by the response, in hours.
- `metadata.latest_empty_bucket` (string (date-time)): Most recent UTC bucket with no qualifying data.
- `series` (object, required, allowed keys: anger, anticipation, boredom, confidence, disgust, distrust, fear, greed, joy, love, optimism, pessimism, sadness, surprise, trust): Emotion observations keyed by the detected emotion label.
- `series.{key}[].post_count` (integer (int64), required): Raw number of posts carrying this emotion in the bucket.
- `series.{key}[].proportion` (number (double), required): Share of classified posts carrying this emotion in the bucket, from 0 to 1.
- `series.{key}[].timestamp` (string (date-time), required): UTC RFC 3339 timestamp for the observation or bucket start.

Media type: `application/json`

## JSON Response

```json
{
  "series": {
    "optimism": [
      {
        "post_count": 286,
        "proportion": 0.37,
        "timestamp": "2026-08-07T15:00:00Z"
      }
    ]
  }
}
```
