Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/config/sidebar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1154,6 +1154,10 @@ export const SIDEBAR: Partial<Record<Sections, SectionEntry[]>> = {
title: "24/5 US Equities User Guide",
url: "data-streams/rwa-streams/24-5-us-equities-user-guide",
},
{
title: "APAC Equities",
url: "data-streams/rwa-streams/apac-equities",
},
],
},
{
Expand Down
420 changes: 328 additions & 92 deletions src/content/data-streams/llms-full.txt

Large diffs are not rendered by default.

197 changes: 150 additions & 47 deletions src/content/data-streams/market-hours.mdx

Large diffs are not rendered by default.

66 changes: 36 additions & 30 deletions src/content/data-streams/reference/report-schema-v11.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ metadata:
"Post-market",
"Real World Assets",
"US Equities",
"APAC Equities",
"marketStatus",
]
---

Expand All @@ -37,45 +39,49 @@ Chainlink Data Streams that use the RWA Advanced (v11) schema adhere to the stru

### Market Status Values

The `marketStatus` field indicates the current state of the market. The possible values vary depending on the stream's supported trading hours:
<Aside type="caution" title="Use marketStatus, not timestamps">
Always use <code>marketStatus</code> to determine whether a market is open. Do <strong>not</strong> use{" "}
<code>observationsTimestamp</code>, <code>lastSeenTimestampNs</code>, or other timestamp fields — timestamps indicate
when data was last recorded, not whether the market is currently active.
</Aside>

#### Standard RWA Streams
The v11 schema defines six numeric values (`0`–`5`), but **the values that appear on a given feed depend on its trading-hours model**. Check which mapping applies to your stream before implementing logic. For full trading schedules, see [Market Hours](/data-streams/market-hours).

For streams with standard market hours coverage. Unless a feed explicitly states extended hours support, it is assumed to follow this format:
#### Standard-hours feeds

| Value | Status | Description |
| ----- | ----------- | ---------------------------------- |
| `0` | **Unknown** | Market status cannot be determined |
| `1` | **Closed** | Market is closed |
| `2` | **Open** | Market is open |
Used by [APAC Equities](/data-streams/rwa-streams/apac-equities) and any v11 feed without 24/5 extended hours.

#### 24/5 US Equities Streams
| Value | Status | Used? | Description |
| ----- | ----------- | ------ | ----------------------------------------------------------------------------------------------- |
| `0` | **Unknown** | Yes | Market status cannot be determined |
| `1` | N/A | **No** | Not mapped. Do not treat as Closed or Pre-market. |
| `2` | **Open** | Yes | Market is open during a regular trading session |
| `3` | N/A | **No** | Not mapped. Do not treat as Post-market. |
| `4` | N/A | **No** | Not mapped. Do not treat as Overnight. |
| `5` | **Closed** | Yes | Market is closed (outside trading hours, lunch breaks, closing auctions, weekends, or holidays) |

For streams with 24/5 extended hours coverage (e.g., US Equities):
<Aside type="caution">
Values <code>1</code>, <code>3</code>, and <code>4</code> are reserved for 24/5 session types and **will not appear**
on these feeds. On standard-hours feeds, <code>5</code> covers intraday closures such as lunch breaks and closing
auctions — not only weekends and holidays.
</Aside>

| Value | Status | Normal Hours (ET) | Description |
| ----- | ----------------- | ------------------------------------- | ---------------------------------------------------------- |
| `0` | **Unknown** | — | Market status cannot be determined |
| `1` | **Pre-market** | 4:00am–9:30am Mon–Fri | Extended hours before regular trading session |
| `2` | **Regular hours** | 9:30am–4:00pm Mon–Fri | Primary trading session with highest liquidity |
| `3` | **Post-market** | 4:00pm–8:00pm Mon–Fri | Extended hours after regular trading session |
| `4` | **Overnight** | 8:00pm–4:00am Sun evening–Fri morning | Overnight session with limited liquidity |
| `5` | **Closed** | — | Market closed (weekends, holidays, or unexpected closures) |
During closing auction periods and daily lunch breaks on APAC exchanges, `marketStatus` is `5` (Closed) even though the exchange trading day has not fully ended. See [Market Hours (APAC Equities)](/data-streams/market-hours#apac-equities) for session schedules.

Users should implement appropriate safeguards based on market status, such as pausing trading, adjusting risk parameters, or implementing staleness checks during non-regular hours or closed periods.
#### 24/5 US Equities feeds

<Aside type="caution" title="Use marketStatus for Stream Selection">
The `marketStatus` field is the authoritative signal for determining market availability and selecting which stream to
consume. Do not use `observationsTimestamp`, `lastSeenTimestampNs`, or any other timestamp field to infer whether a
market is open or to decide which stream to use. Timestamps reflect when data was last recorded, not the current state
of the market.
</Aside>
Used by [24/5 US Equities](/data-streams/rwa-streams/24-5-us-equities-user-guide) streams with extended and overnight sessions.

<Aside type="note" title="Handling Unknown and Closed Status">
Consumers should implement logic to handle market status `0` (Unknown) and market status `5` (Closed), as these
periods imply no active feed and require a decision on fallback behavior (e.g., using a tokenized price, pausing the
market, etc.).
</Aside>
| Value | Status | Hours (ET) | Description |
| ----- | ----------------- | ------------------------------------- | ------------------------------------------------------------------------------------- |
| `0` | **Unknown** | N/A | Market status cannot be determined |
| `1` | **Pre-market** | 4:00am–9:30am Mon–Fri | Extended hours before regular trading session |
| `2` | **Regular hours** | 9:30am–4:00pm Mon–Fri | Primary trading session with highest liquidity |
| `3` | **Post-market** | 4:00pm–8:00pm Mon–Fri | Extended hours after regular trading session |
| `4` | **Overnight** | 8:00pm–4:00am Sun evening–Fri morning | Overnight session with limited liquidity |
| `5` | **Closed** | N/A | Market closed (weekends, holidays, or unexpected closures; ~8:00pm Fri–8:00pm Sun ET) |

Implement appropriate safeguards based on market status — such as pausing trading, adjusting risk parameters, or adding staleness checks during non-regular or closed periods. See [Best Practices](/data-streams/concepts/best-practices#market-hours) for guidance.

### Notes

Expand Down
29 changes: 23 additions & 6 deletions src/content/data-streams/reference/report-schema-v8.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ title: "Report Schema: RWA Standard (v8)"
metadata:
title: "RWA Standard (v8) | Chainlink Data Streams"
description: "Learn about Chainlink Data Streams RWA Standard (v8) schema, including fields, encoding, and examples for integrating RWA data in your applications."
keywords: ["Report Schema", "RWA", "Real World Assets", "v8 Schema", "Data Format", "Report Structure"]
keywords:
["Report Schema", "RWA", "Real World Assets", "v8 Schema", "Data Format", "Report Structure", "marketStatus"]
---

import DataStreams from "@features/data-streams/common/DataStreams.astro"
import ReportSchemaTabs from "@features/data-streams/common/ReportSchemaTabs.astro"
import SchemaFieldsTable from "@features/data-streams/common/SchemaFieldsTable.astro"
import { Aside } from "@components"

<DataStreams section="dsNotes" />

Expand All @@ -22,10 +24,25 @@ RWA streams adhere to the report schema outlined below.

<SchemaFieldsTable schema="v8" />

**Notes**:
### Market Status Values

- `marketStatus`:
- The `marketStatus` field is the authoritative signal for determining whether a market is open. Do not use `observationsTimestamp` (or any other timestamp field) to infer whether a stream is active or to select among multiple streams — timestamps reflect when an observation was last recorded, not whether the market is currently open.
- Users are responsible for handling market status changes in their applications.
- For further guidance, refer to the [Handling Market Events](/data-streams/rwa-streams/handling-market-events) documentation.
<Aside type="caution" title="Use marketStatus, not timestamps">
Always use <code>marketStatus</code> to determine whether a market is open. Do <strong>not</strong> use
<code>observationsTimestamp</code>, <code>lastUpdateTimestamp</code>, or any other timestamp field — timestamps
indicate when data was last recorded, not whether the market is currently active.
</Aside>

v8 streams use a three-value mapping:

| Value | Status | Description |
| ----- | ----------- | ---------------------------------- |
| `0` | **Unknown** | Market status cannot be determined |
| `1` | **Closed** | Market is closed |
| `2` | **Open** | Market is open |

For trading schedules by asset class, see [Market Hours](/data-streams/market-hours). For integration guidance during market transitions, see [Handling Market Events](/data-streams/rwa-streams/handling-market-events).

### Notes

- Users are responsible for handling market status changes in their applications.
- Future RWA streams may use different report schemas.
122 changes: 122 additions & 0 deletions src/content/data-streams/rwa-streams/apac-equities.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
---
section: dataStreams
date: "Last Modified"
title: "APAC Equities"
metadata:
title: "APAC Equities | Chainlink Data Streams"
description: "Reference for Chainlink Asia-Pacific (APAC) Equities Data Streams, covering coverage, schema, trading hours, and risk considerations."
whatsnext:
{
"Find the schema of data to expect from Data Streams reports: RWA Advanced (v11)": "/data-streams/reference/report-schema-v11",
"Learn about Data Streams market hours and schedules": "/data-streams/market-hours#apac-equities",
"Learn about developer responsibilities": "/data-streams/developer-responsibilities",
}
---

import SchemaFieldsTable from "@features/data-streams/common/SchemaFieldsTable.astro"
import { FeedList } from "@features/feeds"

Asia-Pacific (APAC) Equities streams provide high-frequency, transparent price data for major Asia-Pacific indices and single-name stocks. These streams enable onchain protocols to build liquid, capital-efficient markets around globally relevant APAC assets, including sectors such as AI, semiconductors, and consumer goods.

Each instrument is quoted during its exchange's standard trading hours. Integrators should monitor `marketStatus`, data freshness, and the risk considerations below.

Developers are responsible for choosing the appropriate feed and ensuring that the operation and performance of their choice matches expectations. For more information, see the [Developer Responsibilities](/data-streams/developer-responsibilities) guidance.

## Schema

APAC Equities data is delivered using the [RWA Advanced (v11) schema](/data-streams/reference/report-schema-v11).

<SchemaFieldsTable schema="v11-apac" />

For `marketStatus` value mappings, see [Standard-hours feeds (v11)](/data-streams/reference/report-schema-v11#standard-hours-feeds). For exchange schedules, see [Market Hours (APAC Equities)](/data-streams/market-hours#apac-equities).

## Coverage

APAC Equities streams cover major indices and single-name stocks across Asia-Pacific exchanges. Data is quoted in each exchange's local currency (for example, `/JPY` for Japanese equities).

### Exchanges

| Exchange | Code | Local currency | Status |
| -------------------- | ---- | -------------- | --------- |
| Korea Exchange | KRX | KRW | Available |
| Tokyo Stock Exchange | TSE | JPY | Available |

Other APAC exchanges are coming soon.

## Trading hours

APAC equities trade during each exchange's standard local sessions (Mon–Fri). Schedules, lunch breaks, and closing auction behavior are documented on the [Market Hours](/data-streams/market-hours#apac-equities) page.

## Risk considerations

Integrating protocols are responsible for implementing appropriate monitoring and risk mitigation mechanisms to ensure safe market operation.

### Data freshness

Protocols should continuously monitor the `lastSeenTimestampNs` field to verify data recency. A lagging or stale timestamp indicates that fresh pricing inputs are not being received. In such cases, protocols should restrict or suspend trading and liquidations until data freshness is restored.

Consuming data when `marketStatus = 5` (Closed) is not recommended. Protocols should consider pausing or restricting activity until `marketStatus = 2` (Open) is confirmed.

When a session is closed, prices hold at the last traded value until the next session opens. A flat, unchanging price during a closed period is expected behavior and does not indicate a data quality issue. Do not use price movement as a proxy for market activity — use `marketStatus` as the authoritative signal.

### Scheduled intraday breaks and freshness thresholds

TSE-listed equities observe a scheduled lunch break (11:30–12:30 JST / 02:30–03:30 UTC) during which `marketStatus = 5` (Closed) and no new price data is published. `lastSeenTimestampNs` will not advance for approximately 60 minutes during this window.

Freshness monitoring logic that evaluates timestamp age alone should account for this break. A staleness threshold shorter than ~60 minutes will fire during the TSE lunch break, producing false-positive alerts and potentially unnecessary circuit-breaker activity.

Recommended approach: check `marketStatus` before evaluating freshness. If `marketStatus = 5`, staleness is expected and should not trigger restrictions; evaluate freshness thresholds only when `marketStatus = 2` (Open).

KRX-listed equities have no intraday break; the session runs continuously from 09:00–15:20 KST (00:00–06:20 UTC).

### Opening and closing auction prices

At the open of each session, prices may reflect the exchange's opening auction mechanism rather than continuous traded prices. Opening auctions concentrate deferred orders from the closed period into a single price discovery event, which can produce an opening price that deviates materially from the prior session's close. This is normal exchange behavior, not a data quality issue.

The same consideration applies at the start of the TSE afternoon session (12:30 JST / 03:30 UTC) following the lunch break.

Protocols should account for session-open volatility by:

- Treating the `marketStatus` transition from `5` (Closed) to `2` (Open) as a signal to re-evaluate risk parameters before acting on the opening price
- Widening deviation thresholds or reducing position exposure during the first minutes of each session
- Avoiding liquidation triggers driven purely by price movement relative to the prior session's close

### Exchange halts

Underlying markets may halt trading due to regulatory actions, news events, volatility controls, or operational issues. **These events are not explicitly reflected in the `marketStatus` field.**

Protocols are responsible for detecting halt conditions and implementing safeguards (for example, pausing trading or disabling liquidations) to prevent execution against stale or non-actionable prices.

### Corporate actions

Equities are subject to corporate actions (for example, stock splits, reverse splits, and dividends) that can materially impact price and position value between trading sessions. Protocols should monitor corporate action events and adjust pricing logic, collateral parameters, and open positions accordingly. This may include pausing markets during corporate action windows to prevent unfair liquidations.

### Single-source data

Each APAC market is sourced from a single institutional-grade data provider per feed. While this enables high-frequency, low-latency delivery, it introduces dependency on the underlying provider's data quality and availability. There is no redundant cross-validation between providers for a given feed.

If the underlying provider fails to deliver data during an active session, there is no fallback source. A gap in price data during exchange open hours may not be accompanied by a `marketStatus` change — the feed may continue reporting `marketStatus = 2` (Open) while `lastSeenTimestampNs` stops advancing. Staleness monitoring is therefore critical during open sessions, not only when the market is closed.

Recommended safeguards include:

- Monitor `lastSeenTimestampNs` for staleness during open sessions
- Implement price deviation checks against recent valid observations
- Detect sustained periods of no price movement during `marketStatus = 2` as a potential gap condition
- Pause or restrict market activity when data quality signals are triggered
- Review the [Developer Responsibilities](/data-streams/developer-responsibilities) guidance before integration

## Available streams

{/* TODO: Refine filtering based on RDD implementation once APAC equity feed metadata is finalized. */}

<FeedList
client:idle
initialNetwork="arbitrum"
dataFeedType="streamsRwa"
forceApacEquitiesOnly={true}
allowNetworkTableExpansion={true}
/>

## Support

For inquiries related to a data outage, contact Chainlink Labs at [data_support@chain.link](mailto:data_support@chain.link).
59 changes: 31 additions & 28 deletions src/features/data-streams/common/SchemaFieldsTable.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
import { REPORT_SCHEMA_DEFINITIONS } from "../../feeds/components/reportSchemaData.ts"
import schemaFieldsTableStyles from "./schemaFieldsTable.module.css"

interface Props {
schema: string
Expand All @@ -11,35 +12,37 @@ const schemaDef = REPORT_SCHEMA_DEFINITIONS[schema]

{
schemaDef && (
<table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
{schemaDef.fields.map((f) => (
<div class={schemaFieldsTableStyles.wrapper}>
<table class={schemaFieldsTableStyles.table}>
<thead>
<tr>
<td>
<code>{f.field}</code>
</td>
<td>
<code>{f.type}</code>
</td>
<td>
{f.description}
{f.link && (
<>
{" "}
— <a href={f.link.href}>{f.link.label}</a>
</>
)}
</td>
<th>Field</th>
<th>Type</th>
<th>Description</th>
</tr>
))}
</tbody>
</table>
</thead>
<tbody>
{schemaDef.fields.map((f) => (
<tr>
<td>
<code>{f.field}</code>
</td>
<td>
<code>{f.type}</code>
</td>
<td>
{f.description}
{f.link && (
<>
{" "}
— <a href={f.link.href}>{f.link.label}</a>
</>
)}
</td>
</tr>
))}
</tbody>
</table>
</div>
)
}
Loading
Loading