# Release 0.0.5 (/docs/release-notes/0.0.5)



Proof-point time series now return the full period you ask for. A bucket with no proof points has a count of `0`, so a chart from 2010 through 2025 can be drawn without filling in missing years.

This is a **response change** on the time-series routes introduced in [Release 0.0.1](/docs/release-notes/0.0.1). Request bodies are unchanged. Project activity time series already returned every bucket and is unchanged.

## What you get back [#what-you-get-back]

`labels` and `counts` stay aligned. `weightedCounts`, when you asked for them, is `0` on the same empty buckets.

| Window                           | Series                                                                        |
| -------------------------------- | ----------------------------------------------------------------------------- |
| `start` and `end` set            | Every bucket from `start` through `end`, including leading and trailing zeros |
| `start` omitted                  | Begins at the first bucket that has proof points, then fills through `end`    |
| `end` omitted                    | `end` still defaults to now, so zeros run through the current bucket          |
| `end` set to `null`              | Stops at the last bucket that has proof points                                |
| No proof points, both bounds set | The full window, every count `0`                                              |
| No proof points and no `start`   | An empty series                                                               |

The same rule applies at every `resolution`: `day`, `week`, `month`, `quarter`, and `year`. A year chart is the common case; a month chart fills empty months the same way.

`counts` of `0` means there were no proof points in that bucket. It is not a missing or failed response.

## Routes [#routes]

| Route                                              | What changed                                                   |
| -------------------------------------------------- | -------------------------------------------------------------- |
| `POST /proof-points/news-articles/time-series`     | Empty buckets in the published-date window are returned as `0` |
| `POST /proof-points/research-articles/time-series` | Same                                                           |
| `POST /proof-points/patents/time-series`           | Same                                                           |
| `POST /proof-points/pdfs/time-series`              | Same                                                           |
| `POST /proof-points/earnings-calls/time-series`    | Same                                                           |
| `POST /proof-points/projects/time-series`          | Same. `start` / `end` are still published date                 |
| `POST /proof-points/projects/activity-time-series` | Unchanged                                                      |

Schemas are in the [OpenAPI spec](https://connect-api.trendtracker.ai/openapi.json) and the [API reference](/docs/api-reference). See [Proof points](/docs/proof-points) for the shared time-series shape.

## Brands [#brands]

This is an **additive** change. One read route exposes a brand directory. The collection is mostly perfume brands for now. These are not knowledge-graph searches: there is no `topicQuery`, `gpeQuery`, or time series.

| Route               | What it does                                                                                                                            |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /facts/brands` | A page of brands. `query` is an optional case-insensitive substring of `name`, `labels`, or `description`. `ids` keeps specific brands. |

`take` is at most 100. `sortColumn` is `name`. `sortDirection` is `desc` by default. Set `returnTotal` to include the match count.

Each brand has `name`, `labels` (stored in lowercase; `name` may be included), and optional `website`, `image`, `description`, and `people`. `metadata` holds source URLs: `fragsi`, `wikidata`, `lineage`, and `brandtree`. `metadata.organization` is the company behind the brand, when one is known: `name`, `description`, `image`, `website`, `city`, `country`, `founded`, `ticker`, and `alternativeNames`. Source ids are left out. `organizationIds` are knowledge-graph organization ids when resolution succeeded.

## Fragrance families and groups [#fragrance-families-and-groups]

This is an **additive** change. Two read routes expose a fragrance family directory and a fragrance group directory. A group belongs to one family. These are not knowledge-graph searches: there is no `topicQuery`, `gpeQuery`, or time series.

| Route                           | What it does                                                                                                                                |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /facts/fragrance-families` | A page of families. `query` is an optional case-insensitive substring of `name`, `labels`, or `description`. `ids` keeps specific families. |
| `GET /facts/fragrance-groups`   | A page of groups. `query` works the same way. `familyId` keeps groups in one family. `ids` keeps specific groups.                           |

`take` is at most 100. `sortColumn` is `name`. `sortDirection` is `desc` by default. Set `returnTotal` to include the match count.

Each record has `name`, `labels` (stored in lowercase; `name` may be included), and optional `description`. `metadata` holds source URLs: `perfumeSociety`, `wikidata`, and `fragrantica`. A group has `family`, with `id` and `name`.

## Fragrance note groups and fragrance notes [#fragrance-note-groups-and-fragrance-notes]

This is an **additive** change. Two read routes expose a fragrance note group directory and a fragrance note directory. A fragrance note belongs to one group. These are not knowledge-graph searches: there is no `topicQuery`, `gpeQuery`, or time series.

| Route                              | What it does                                                                                                                                                                            |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /facts/fragrance-note-groups` | A page of groups. `query` is an optional case-insensitive substring of `name`, `labels`, or `description`. `ids` keeps specific groups.                                                 |
| `GET /facts/fragrance-notes`       | A page of fragrance notes. `query` is an optional case-insensitive substring of `name` or `labels`. `groupId` keeps fragrance notes in one group. `ids` keeps specific fragrance notes. |

`take` is at most 100. `sortColumn` is `name`. `sortDirection` is `desc` by default. Set `returnTotal` to include the match count.

Each record has `name`, `labels` (stored in lowercase; `name` may be included), and optional `image`. A group also has an optional `description`. `metadata.fragrantica` is the Fragrantica page when one is known. A fragrance note has `group`, with `id` and `name`.
