> ## Documentation Index
> Fetch the complete documentation index at: https://api.tryspecter.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Delivery and formats

> How Specter datasets are delivered: destinations, formats, cadence, file naming, and how to load them.

Specter datasets are bulk deliveries of the same data the API serves, written to your
own cloud storage on a schedule. They suit backfills, warehouse loads and analysis over
the full corpus; the [API](/api-ref/introduction) suits per-record lookups and enrichment
inside a product.

## Destinations

We write to storage you own and control.

| Destination          |
| -------------------- |
| AWS S3               |
| Google Cloud Storage |

Every dataset is available on both. If you need a destination that isn't listed,
[contact support](mailto:api-support@tryspecter.com).

## Formats

| Format  | Status                                                                                                                                                                                                               |
| ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Parquet | Every dataset, every new delivery. Columnar, compressed and typed — nested fields arrive as structs rather than encoded strings                                                                                      |
| CSV     | **Legacy.** Still written for the deliveries that already take it, and no longer offered for new ones. Nested fields are flattened or serialized as JSON strings, and the column headers differ from the field names |

## Datasets

| Dataset                                                                   | Full delivery                  | Incremental | Formats               |
| ------------------------------------------------------------------------- | ------------------------------ | ----------- | --------------------- |
| [Company DB](/api-ref/datasets/company/overview)                          | Monthly, last day of the month | Daily       | Parquet, CSV (legacy) |
| [Revenue & Valuation DB](/api-ref/datasets/revenue/overview)              | Monthly, by the 5th            | —           | Parquet               |
| [News Signals](/api-ref/datasets/news-signals/overview)                   | Daily                          | —           | Parquet               |
| [People DB](/api-ref/datasets/people/overview)                            | Monthly, last day of the month | Daily       | Parquet               |
| [Talent Signals](/api-ref/datasets/talent/overview)                       | Monthly, last day of the month | Daily       | Parquet               |
| [Investor DB](/api-ref/datasets/investor/overview)                        | Monthly, last day of the month | —           | Parquet, CSV (legacy) |
| [Investor Interest Signals](/api-ref/datasets/investor-interest/overview) | Weekly, Friday 23:00 CET       | —           | Parquet, CSV (legacy) |
| [Transactions DB](/api-ref/datasets/transactions/overview)                | Monthly, last day of the month | Daily       | Parquet               |

## File naming

Every delivery is named for the period it covers, so a run is reproducible from its
filename alone.

| Dataset                    | Pattern                                                                   | Example                                                       |
| -------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------- |
| Company DB                 | `company-data_YYYY-MM`                                                    | `company-data_2026-06`                                        |
| Revenue & Valuation DB     | `revenue_valuation/YYYY-MM/revenue_valuation_YYYY_MM.parquet`             | `revenue_valuation/2026-06/revenue_valuation_2026_06.parquet` |
| News Signals               | `news-signals_YYYYMMDD`                                                   | `news-signals_20260526`                                       |
| News Signals, revenue only | `revenue-signals_YYYYMMDD`                                                | `revenue-signals_20260526`                                    |
| People DB                  | `People DB/YYYY-MM/people_db_YYYY-MM.<partition>.parquet`                 | `People DB/2026-03/people_db_2026-03.0.parquet`               |
| Talent Signals             | `Talent Signals/YYYY-MM/talent_signals_YYYY-MM.<partition>.parquet`       | `Talent Signals/2026-03/talent_signals_2026-03.0.parquet`     |
| Investor DB                | `investors/YYYY-MM/investors.csv`                                         | `investors/2026-03/investors.csv`                             |
| Investor Interest Signals  | `strategic-intelligence_YYYYWW`                                           | `strategic-intelligence_202647`                               |
| Transactions DB            | `Transactions/YYYY-MM/{funding_rounds,acquisitions,ipos}_YYYY_MM.parquet` | `Transactions/2026-06/funding_rounds_2026_06.parquet`         |

Larger datasets are split across numbered partitions. Read every partition under a
period's prefix as one logical delivery — the partition count changes as the data grows.

News Signals is delivered as **one file**, and revenue signals are part of it — a News
Signals delivery already includes them. A customer who takes revenue signals on their own
receives one file too, carrying the revenue subset of the same rows. Either way the
columns are identical; the filename says which you have.

## Full and incremental deliveries

A **full delivery** is the entire dataset as of its period. Load it by replacing what you
hold for that dataset.

An **incremental delivery** carries only the records that changed since the previous one.
Apply it by upserting on the dataset's key — `company_id` for Company DB, and the
equivalent identifier on the others. Records are never renumbered, so an identifier that
arrived in a full delivery stays valid across every incremental that follows.

Datasets marked "—" above have no incremental stream; take the next full delivery.

## How long a delivery stays

Every file is removed from your bucket **90 days after it lands**. The window is rolling,
so at any point you hold roughly the last three months of deliveries and nothing older.

Load each delivery into your own storage as it arrives rather than treating the bucket as
an archive. A dataset you have not loaded within 90 days has to be re-cut and re-sent,
which is not immediate.

## How changes are announced

A change that removes a field, renames one, or alters the shape of an existing one is
published in the [dataset changelog](/api-ref/datasets/changes) **at least one month
before the delivery that carries it**, with the date it takes effect.

New fields are additive and can arrive in any delivery without notice, so read by column
name rather than by position, and ignore columns you do not recognise.

## Loading a delivery

Nothing here is required — use whatever your stack already runs. These are the paths
that need the least work.

| Goal                  | Tools                                                                      |
| --------------------- | -------------------------------------------------------------------------- |
| Query files in place  | DuckDB, Amazon Athena, BigQuery external tables, Snowflake external tables |
| Load into a warehouse | BigQuery, Snowflake, Redshift, ClickHouse                                  |
| Process at scale      | Apache Spark, Polars, Dask                                                 |
| Transform and model   | dbt, SQLMesh                                                               |
| Explore locally       | DuckDB, pandas, Polars                                                     |

Nested fields (`array<object>` and `object` in the field reference) arrive as native
Parquet structs. Most engines read them directly; flatten them with `UNNEST` in DuckDB,
`explode` in Spark, or the equivalent in your engine.

## Next

<CardGroup cols={2}>
  <Card title="Dataset changelog" icon="clock-rotate-left" href="/api-ref/datasets/changes">
    Field and delivery changes, with the date each takes effect.
  </Card>

  <Card title="Specter API" icon="plug" href="/api-ref/introduction">
    The same data, requested per record.
  </Card>
</CardGroup>
