# Generated by tools/build_contracts.py from tools/algoseek_catalog.py -- do not edit by hand.
# Open Data Contract Standard v3.2.0 (https://bitol-io.github.io/open-data-contract-standard/).
apiVersion: v3.2.0
kind: DataContract
id: urn:alphaswarm:datacontract:algoseek:us-equities-industry-standard-trade-only-minute-bar
name: AlgoSeek US Equities Industry Standard Trade Only Minute Bar
version: 0.1.0
status: draft
domain: market-data
tags:
- algoseek
- licensed-data
- equity
- us
- bar
description:
  purpose: One row is a one-minute OHLC, volume-weighted price, share volume and trade-count bar for one
    US-listed equity, calculated with AlgoSeek's 'industry standard' trade-filtering and bar-timing rules
    from SIP trades only (no quotes). Intended for standardized intraday analysis, benchmarking and reconciliation.
  usage: Backtesting, execution and microstructure research, feature engineering for US equities.
  limitations: 'Delivered as recorded from the source feed: AlgoSeek does not remove crossed or locked
    quotes, bad prints, or out-of-sequence packets unless contracted to. Consumers own cleaning. Industry-standard
    bar filter (guide Appendix B): drop Price = 0, Quantity = 0, Trade Cancel events and the original
    trade that was later cancelled; apply the exclude/include flag lists in enums_and_codes; count both
    NBBO and exchange trades. This differs materially from the standard bar (e.g. tOutOfSequence is kept,
    tCash/tNextDay/tOddLot are dropped). Cross-dataset check on the same AAPL 2023-08-02 09:30 bar: industry
    standard 761,329 shares / 1,450 trades vs standard 848,436 / 7,183 and ex-FINRA 663,233 / 1,075. Odd
    lots (<100 shares) are excluded via tOddLot, but FINRA TRF reports are not excluded by Exchange field
    in this logic, so TRF prints that pass the flag rules remain. Bars are sparse: a row exists only if
    at least one qualifying trade occurred in the interval, so skipped timestamps mean no trades, not
    zero-volume rows (guide Table 3 shows GAL bars at 10:06, 10:13, 10:25).'
  authoritativeDefinitions:
  - type: businessDefinition
    url: https://algoseek.com/dataset/us-equities-industry-standard-trade-only-minute-bar/
  - type: implementation
    url: https://algoseek.com/data-docs/equity-market-data/algoseek.US.Equity.Trades.Only.Industry.Standard.Minute.Bar.pdf
  - type: implementation
    url: https://algoseek.com/docs/rest-api/reference
context:
  instructions: Times are local US Eastern clock times (DST-aware), not UTC. Treat TRADE NB / NBBO-flagged
    rows as the backtest-grade subset. Cancellations reference earlier trades and can arrive hours later,
    so aggregate only after the session closes. Prices are unadjusted unless the dataset name says Adjusted;
    join us-equities-*-adjustment-factors on SecId for adjustment.
  verifiedStatements:
  - id: vs1
    question: What time zone are the timestamps in?
    answer: US Eastern local time with daylight saving (the guides label it EST/ET).
  - id: vs2
    question: Are prices adjusted for splits and dividends?
    answer: Only in datasets whose name contains Adjusted; all others are as traded.
  constraints:
  - id: c1
    constraint: 'Licensed vendor data: never export raw rows to a tenant-local destination or include
      them verbatim in a public artifact; serve only through entitlement-checked platform reads.'
  - id: c3
    constraint: Do not treat the vendor's `Ticker` as a stable identity across time; join on an AlgoSeek
      security key (SecId or ASID, which are distinct) or the platform symbol mapping.
servers:
- server: algoseek-s3
  type: s3
  environment: vendor
  description: AlgoSeek flat-file delivery (the layout the schema below describes).
  location: s3://${ALGOSEEK_S3_BUCKET_EQ_TRADES_1MIN_IND_STD}/
  format: csv
  encoding: UTF-8
  customProperties:
  - property: layout
    value: 'CSV with a fixed header row, one file per symbol per trading day by default (e.g. all AAPL
      bars for one day in one file); the guide says each day''s CSV files are zip-compressed (sibling
      bar guides say gzip). Page: files are organized by trading date and ticker. Header-only file when
      a ticker had no trades. No bucket names are given.'
  - property: compression
    value: gzip
  - property: header
    value: true
  - property: entitlement
    value: Bucket access is granted per subscription; bucket names arrive with license provisioning.
- server: algoseek-rest-api
  type: api
  environment: vendor
  description: AlgoSeek Datasets REST API (X-API-KEY header; JSON, CSV or gzipped CSV). Returns AlgoSeek's
    normalized API layout, which differs from the flat-file columns in this contract's schema.
  location: https://api.algoseek.com/v1/data/us-equity/trades-1min/:identifier?aggregation_logic=industry_std
  customProperties:
  - property: auth
    value: X-API-KEY header issued by AlgoSeek
  - property: columnsEndpoint
    value: https://api.algoseek.com/v1/meta/datasets/{dataset_id}/columns
  - property: statusEndpoint
    value: https://api.algoseek.com/v1/meta/datasets/{dataset_id}/status
  - property: responseFormats
    value:
    - json
    - csv
    - csv_gzip
  - property: pagination
    value: offset + limit; tick endpoints take trade_date and identifier (Ticker or ASID) in the path
schema:
- name: us_equities_industry_standard_trade_only_minute_bar
  physicalName: eq_trades_1min_ind_std
  physicalType: file
  logicalType: object
  businessName: US Equities Industry Standard Trade Only Minute Bar
  description: One row is a one-minute OHLC, volume-weighted price, share volume and trade-count bar for
    one US-listed equity, calculated with AlgoSeek's 'industry standard' trade-filtering and bar-timing
    rules from SIP trades only (no quotes). Intended for standardized intraday analysis, benchmarking
    and reconciliation.
  dataGranularityDescription: one ticker x one trading day x one minute that had at least one qualifying
    trade
  properties:
  - name: Date
    logicalType: date
    logicalTypeOptions:
      format: yyyymmdd
    physicalType: string (yyyymmdd) (csv text)
    description: Trading date of the bar, in yyyymmdd form.
    primaryKey: true
    primaryKeyPosition: 1
    required: true
    partitioned: true
    partitionKeyPosition: 1
    customProperties:
    - property: evidence
      value: guide+sample
  - name: Ticker
    logicalType: string
    physicalType: string (csv text)
    description: Symbol name (ticker) of the security the bar belongs to.
    primaryKey: true
    primaryKeyPosition: 2
    required: true
    partitioned: true
    partitionKeyPosition: 2
    customProperties:
    - property: evidence
      value: guide+sample
  - name: TimeBarStart
    logicalType: time
    logicalTypeOptions:
      format: HH:MM
    physicalType: string (time) (csv text)
    description: Start time of the bar (US Eastern); HH:MM for minute bars. Bars with no qualifying trade
      are omitted.
    primaryKey: true
    primaryKeyPosition: 3
    required: true
    customProperties:
    - property: evidence
      value: guide+sample
  - name: FirstTradePrice
    logicalType: number
    physicalType: decimal (csv text)
    description: Price of the first qualifying trade in the bar (bar open).
    customProperties:
    - property: unit
      value: USD
    - property: evidence
      value: guide+sample
  - name: HighTradePrice
    logicalType: number
    physicalType: decimal (csv text)
    description: Highest trade price in the bar.
    customProperties:
    - property: unit
      value: USD
    - property: evidence
      value: guide+sample
  - name: LowTradePrice
    logicalType: number
    physicalType: decimal (csv text)
    description: Lowest trade price in the bar.
    customProperties:
    - property: unit
      value: USD
    - property: evidence
      value: guide+sample
  - name: LastTradePrice
    logicalType: number
    physicalType: decimal (csv text)
    description: Price of the last qualifying trade in the bar (bar close).
    customProperties:
    - property: unit
      value: USD
    - property: evidence
      value: guide+sample
  - name: VolumeWeightPrice
    logicalType: number
    physicalType: decimal (csv text)
    description: 'Volume-weighted average trade price: sum(price x shares)/sum(shares). The guide''s printed
      formula wrongly subtracts an NBBO midpoint term.'
    customProperties:
    - property: unit
      value: USD
    - property: evidence
      value: guide+sample
  - name: Volume
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Total number of shares traded in the bar.
    customProperties:
    - property: unit
      value: shares
    - property: evidence
      value: guide+sample
  - name: TotalTrades
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Total number of trades in the bar.
    customProperties:
    - property: unit
      value: count
    - property: evidence
      value: guide+sample
  - name: SecId
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: AlgoSeek unique security identifier; survives ticker changes but can change on restructurings
      such as reclassification.
    customProperties:
    - property: evidence
      value: guide-only
  quality:
  - id: row_count_positive
    metric: rowCount
    mustBeGreaterThan: 0
    dimension: completeness
    severity: error
    description: Every delivered partition (trade date, or snapshot) carries at least one row.
  - id: primary_key_unique
    metric: duplicateValues
    mustBe: 0
    arguments:
      properties:
      - Date
      - Ticker
      - TimeBarStart
    dimension: uniqueness
    severity: error
    description: The declared primary key is unique within each delivered partition (one file or table
      snapshot).
  - id: trade_high_ge_low
    type: sql
    description: HighTradePrice is never below LowTradePrice in the same row.
    query: SELECT COUNT(*) FROM {object} WHERE HighTradePrice IS NOT NULL AND LowTradePrice IS NOT NULL
      AND HighTradePrice < LowTradePrice
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: open_close_within_range
    type: sql
    description: 'Open and close usually sit inside the high-low range. Only a warning: some AlgoSeek
      aggregations take open/close from a different event set than high/low (seen in the Daily OHLC sample).'
    query: SELECT COUNT(*) FROM {object} WHERE FirstTradePrice > HighTradePrice OR FirstTradePrice < LowTradePrice
      OR LastTradePrice > HighTradePrice OR LastTradePrice < LowTradePrice
    mustBe: 0
    dimension: accuracy
    severity: warning
  - id: vwap_within_range
    type: sql
    description: VWAP (sum(price*shares)/sum(shares)) lies within the bar's trade range.
    query: SELECT COUNT(*) FROM {object} WHERE VolumeWeightPrice > HighTradePrice OR VolumeWeightPrice
      < LowTradePrice
    mustBe: 0
    dimension: accuracy
    severity: warning
  - id: TotalTrades_non_negative
    type: sql
    description: TotalTrades is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE TotalTrades < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: Volume_non_negative
    type: sql
    description: Volume is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE Volume < 0
    mustBe: 0
    dimension: accuracy
    severity: error
support:
- channel: algoseek-support
  tool: email
  url: mailto:support@algoseek.com
  scope: issues
  description: Vendor support for data defects, missing days, and entitlement problems.
team:
  name: AlphaSwarm data engineering
slaProperties:
- id: update_frequency
  property: frequency
  value: 1
  unit: d
  driver: analytics
- id: retention
  property: retention
  value: license-term
  description: Retention of landed copies is bounded by the AlgoSeek license; purge on termination.
  driver: regulatory
customProperties:
- property: vendor
  value: AlgoSeek
- property: vendorDataGroup
  value: us-equity
- property: vendorDatasetTextId
  value: eq_trades_1min_ind_std
- property: vendorSampleUrl
  value: https://as-metadata-services-assets.s3.amazonaws.com/sample_data/cloud_storage/eq_trades_1min_ind_std.csv
- property: assetClass
  value: equity
- property: venues
  value:
  - NASDAQ
  - BATS
  - NYSE
  - ARCA
  - FINRA Trade Reporting Facilities (TRF)
- property: coverage
  value: Trades for all listed US stocks, ETNs, ETFs, ADRs and funds (page adds preferred stocks, warrants
    and units) from 16+ US exchanges and marketplaces via the SIP; page says on- and off-exchange trades
    including FINRA TRF reports are eligible, subject to the industry-standard exclusions (odd lots, cancelled
    trades, various conditions). History length is not stated.
- property: timezone
  value: America/New_York
- property: timestampFormat
  value: Date yyyymmdd; TimeBarStart HH:MM (bar start, minute resolution). Industry-standard bars are
    shifted by 1 second from 09:31 per guide Appendix B
- property: sessionHours
  value: 04:00-20:00 ET (pre-market 04:00-09:30, regular 09:30-16:00, post-market 16:00-20:00); early-close
    days end trading at 13:00
- property: priceAdjustment
  value: unadjusted
- property: licensedData
  value: true
- property: evidenceGrade
  value: vendor-doc
- property: knownIssues
  value:
  - Primary key is inferred; AlgoSeek's guide does not name one.
  - 'Doc discrepancy: Guide Table 2 lists 11 fields starting with SecId (integer, AlgoSeek unique security
    identifier) and Table 1 shows SecId 33449, but the published sample header has only 10 columns and
    no SecId. SecId is appended as a guide-only column.'
  - 'Doc discrepancy: Guide''s VolumeWeightPrice formula reads sum(Trade_Shares x (Trade_Price - NBBOMidpoint))
    / sum(Trade_Shares), which subtracts a quote-based term that a trade-only dataset cannot have; the
    same sentence and the guide''s own single-trade examples (VWAP equals the trade price) show the intended
    value is sum(price x shares)/sum(shares).'
  - 'Doc discrepancy: Guide intro calls the dataset ''Industry Standard Trade Only Minute Bar Adjusted''
    although this is the unadjusted dataset (text copied from the adjusted guide); Table 1 and Table 3
    sample values are also identical to the standard Adjusted Minute Bar guide''s examples (e.g. AAPL
    20200825 09:30, 1,059,318 shares / 8,387 trades), so they illustrate layout only and not industry-standar…'
  - 'Doc discrepancy: Bar Notes (carried over from sibling guides) say minute bar 11:04 spans >11:04 to
    <11:05, while Appendix B says data are shifted by 1 second from 09:31: 09:30 = 09:30:00.000-09:31:00.999,
    09:31 = 09:31:01.000-09:32:00.999. The two statements conflict; Appendix B is the industry-standard-specific
    one. Whether the shift applies before 09:30 or after the close is not stated.'
  - 'Doc discrepancy: Guide says the dataset covers 04:00-20:00 ET including pre- and post-market, but
    Appendix B excludes events flagged tExtendedHours (bit 13), tCash and tNextDay; the sample covers
    only 09:30-11:09, so it is unclear how extended-hours bars are populated.'
  - 'Doc discrepancy: Guide says daily CSV files are zip-compressed; the other bar guides say gzip. The
    sample is a plain CSV.'
  - 'Doc discrepancy: Catalog <title> for this (unadjusted) page reads ''Industry Standard Trade Only
    Minute Bar, Adjusted | algoseek'', identical to the adjusted page''s title.'
contractCreatedTs: '2026-11-02T00:00:00Z'
