← Sugra APICONTENT HISTORY

Update to Sugra API

Snapshot Oct 24, 2026 · 18:04 UTC · version 1.2.1

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save Sugra API and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Sep 30, 2026 · 22:51 UTC

a9a6bf346a91b32eb011f3e4b38db58ff7c0e215f808a6674920cbda5f3c5bf8

After

Oct 24, 2026 · 18:04 UTC

3f446f1e11ce26bada7c6b8c7d920ca03ecd229ab34080f7fc040418c7075933

Package file

Before

Sep 30, 2026 · 22:51 UTC

127

After

Oct 24, 2026 · 18:04 UTC

101

Package file

Before

Sep 30, 2026 · 22:51 UTC

{"sha256":"640b022d7ee1321920a1c93ddcd8a783e4669ce9aef4aac4b2d82a2630f5cf96","size":3205}

After

Oct 24, 2026 · 18:04 UTC

Not present

Package file

Before

Sep 30, 2026 · 22:51 UTC

fd74fdb64b5f63338a4bc7361c6a66b2826f43052876f655b54d960bde8e4bdf

After

Oct 24, 2026 · 18:04 UTC

87de22ea82764b9bbbc2de6840518f80eca86e8af51e406f9ba5283b2bd3b9fa

Compare saved observations

Download comparison JSON

skills/envelope-and-attribution/SKILL.md

− removed · + added

--- before
+++ after
@@ -0,0 +1,62 @@
+---
+name: envelope-and-attribution
+description: Parse Sugra API payloads over HTTPS or MCP, keep source attribution, and tell observation time from request time. Use when reading a response, citing a figure, or shaping a large payload.
+license: MIT
+---
+
+# Envelope and attribution
+
+The API is LLM-friendly: one JSON envelope `{data, meta}` on most payloads, and the envelope-less exceptions are named below. Envelope detail also lives on https://docs.sugra.ai.
+
+Most responses:
+
+```json
+{
+  "data": {},
+  "meta": {
+    "endpoint": "/api/v1/...",
+    "data_time": "2026-06-12T19:30:00Z",
+    "response_time": "2026-06-12T19:30:01Z",
+    "provider": "Sugra API ...",
+    "source": "fred",
+    "attribution": "<upstream notice, quote it verbatim>",
+    "cached": false
+  }
+}
+```
+
+Always present: `endpoint` (the operation that answered), `data_time`, `response_time`, `provider`. Present when they apply:
+
+| Key | Meaning |
+|---|---|
+| `source` | the upstream source id; name it only when it is a sovereign, intergovernmental, or academic source (Attribution below) |
+| `attribution` | a notice the source requires; repeat it word for word wherever the figure is shown |
+| `period` | the unit of observation (for example `2026-Q1`) when `data_time` is the start of a period |
+| `data_age_days` | days since a time the source itself stated; absent when the source gave only a date or period, or no readable time (Time below) |
+| `cached` | served from the platform cache |
+| `stale`, `stale_since` | the data is older than it should be; say so when quoting it |
+| `fallback_used`, `fallback_chain` | a secondary source answered |
+| `notes` | a data quality caveat; pass it on |
+
+Some payloads also carry a `license` inside `data`. Keep it with the figure.
+
+Some payloads are envelope-less (a flat object with `meta` or `_meta` on the same record). Provenance keys still apply.
+
+HTTP: this JSON body plus `X-RateLimit-*` headers.
+
+MCP: `call_endpoint` / `fetch_data` return the same payload (a top-level array is wrapped as `{data: ...}`). `limit` and `fields` shape the records list in `data`, and lists nested inside records are never truncated; `include_raw` attaches the complete original payload under `raw` when it fits the size cap. An object `data` without a records list, or an envelope-less object, counts as one record for `fields`, and `meta` / `_meta` stay. On the hosted server a projection that matches nothing removes nothing, and the records list can also be the one list inside an object `data`, when exactly one of `data`, `entries`, `events`, `history`, `items`, `observations`, `points`, `records`, `results`, `rows`, `series`, `timeseries` holds a list. Keys beside that list, such as `total` and `count`, stay unless a `fields` entry names a key of `data` itself, which projects `data` as one record instead. Stdio packages up to 0.12.0 do not look inside an object `data` for a records list and can return empty records when no field matches. `meta.shaped` reports `fields_applied`, `fields_unmatched`, `limit_applied` and, on the hosted server, `records_path`.
+
+`meta.shaped` reports what shaping actually did, not an echo of the request. On the hosted server `records_path` names the records list that `limit` bounded or that `fields` were matched against (for example `data.items`), even when no field matched, and is null when shaping used no records list. There `limit` keeps the newest end when every record carries one date or period key in one format and the list runs one way by it (the last N of an oldest-first list, the first N of a newest-first one), and otherwise the first N; `meta.shaped` then reports `order` (`asc`, `desc` or `unknown`) and `kept_end` (`newest` or `first`). When `records_path` is `data.*.observations` (several named sub-series side by side, each bounded on its own), `order` and `kept_end` are maps keyed by sub-series name. Before citing the latest figure from a bounded list, check that `kept_end` is `newest`, for a sub-series the value under its name. Stdio packages up to 0.12.0 keep the first N and report neither.
+
+## Time
+
+`data_time` in `meta` (or `_meta` on a flat payload) is the observation or publication time the source states for the data. When the source states no time, or one that cannot be read, `data_time` falls back to the HTTP response time (in `meta` it then equals `response_time`) and `data_age_days` is absent; for a time that cannot be read, `meta.notes` says so. That fallback is the time of the response, not of the data: never present it as the date of a figure, and if it is shown at all, label it the response time. When `meta.period` is present, `data_time` is the start of that period, not a moment of observation. An `as_of` in a record, in `data`, or in `meta` dates the figure itself: a period, a report or snapshot date, or a collection time. When an `as_of` differs from a `data_time` the source stated, quote both. When nothing dates the figure, say the source time is unavailable. Do not describe a delayed series as a live tick, and say so when `stale` is true.
+
+## Attribution
+
+Every figure needs a source and an as-of. Take the source from `meta` / `_meta`, and the date from an `as_of` wherever it sits, `meta.period`, or a `data_time` the source stated (Time above): name the source, give the date or period or say the source time is unavailable, and when `attribution` is present repeat it verbatim. Live list: https://sugra.ai/sources (MCP resource `sugra://attribution`).
+
+- Sovereign, intergovernmental, and academic sources are named openly (for example FRED, IMF, ECB, NOAA, World Bank, SEC EDGAR).
+- Commercial upstreams appear under Sugra-branded wrappers (Sugra Finance, Sugra News, Sugra Crypto, Sugra Forex, Sugra Weather). Cite the wrapper, not the vendor, even when `meta.source` carries the vendor's id; a required `attribution` notice is still repeated as given.
+
+This is data presentation, not investment, legal, or compliance advice. Screening tools return a signal, not a determination.
Full technical diff · 19 changed fields

changed /files/.app.json/sha256

BEFORE
"a9a6bf346a91b32eb011f3e4b38db58ff7c0e215f808a6674920cbda5f3c5bf8"
AFTER
"3f446f1e11ce26bada7c6b8c7d920ca03ecd229ab34080f7fc040418c7075933"

changed /files/.app.json/size

BEFORE
127
AFTER
101

removed /files/.codex-plugin~1plugin.json

BEFORE
{
  "sha256": "640b022d7ee1321920a1c93ddcd8a783e4669ce9aef4aac4b2d82a2630f5cf96",
  "size": 3205
}
AFTER
Field is absent

changed /files/assets~1logo.png/sha256

BEFORE
"fd74fdb64b5f63338a4bc7361c6a66b2826f43052876f655b54d960bde8e4bdf"
AFTER
"87de22ea82764b9bbbc2de6840518f80eca86e8af51e406f9ba5283b2bd3b9fa"

changed /files/assets~1logo.png/size

BEFORE
10242
AFTER
10425

added /files/mcp.json

BEFORE
Field was absent
AFTER
{
  "sha256": "330035c23f4e4834aec8936e428b3800da68267393739c79d3fab333f5777ca5",
  "size": 196
}

added /files/plugin.json

BEFORE
Field was absent
AFTER
{
  "sha256": "d1b4e45932a114fcc0714e884efd62cdd69c609d04c2709a4dfdb18db58491df",
  "size": 2242
}

added /files/skills~1auth-and-quota~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "18ce5fd0733830f9ffec0dcdd23caea7bab320ae8d5a079d6a9d7ef26cf86288",
  "size": 4712
}

added /files/skills~1auth-and-quota~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "6038f65651101cbc2115c28e347c17deba523d0cc5009e1617e968294a5ef28f",
  "size": 221
}

added /files/skills~1cross-domain-briefing~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "5bff04a3c3b44f27e604a8b2aafb8b1a89b7d9a90e09619f4966cc013e938436",
  "size": 2115
}

added /files/skills~1cross-domain-briefing~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "f54f8ce1d0d94e1d3f4acb5c5e764680cce656453d72d3e2a1ccec55991e4ea2",
  "size": 241
}

added /files/skills~1discover-and-call~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "b7a648fd1ce2e39612ef509c37c9202b74469e467371fa5780c02e02f15937fb",
  "size": 5245
}

added /files/skills~1discover-and-call~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "2c4bb1d37b8f426651a4472614f2caa972fc42f2668c315adf1ffacbcf84f551",
  "size": 226
}

added /files/skills~1envelope-and-attribution~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "e5241b9d8dea55b47251db85c0cc500d08abb272c3f242c4715103b1a92715c9",
  "size": 6008
}

added /files/skills~1envelope-and-attribution~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "10834f55e183cd43bb1be1e3f2a47ce2ea1a6e2839804dfe8c585867d67b8154",
  "size": 241
}

added /files/skills~1live-docs~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "3af18eb9cdcd0e483206df7b0fbeea66441b4c6be5c3c59e6832dd7e74718b85",
  "size": 2609
}

added /files/skills~1live-docs~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "bbd8b385c43aa8b4017cd7eea32f39d4997438da1b24587b6ab16560aaf41908",
  "size": 213
}

added /files/skills~1using-sugra-api~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "d981b6e137cf06a1d2bd8380f2ab9659ad99c0249f4b9bf46efa14ed6e616d9c",
  "size": 2918
}

added /files/skills~1using-sugra-api~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "544c62aa8e5122875b31ac6834d398bb4e30920a862383b5e477eba190162537",
  "size": 212
}
Full snapshot data
{
  "files": {
    ".app.json": {
      "sha256": "3f446f1e11ce26bada7c6b8c7d920ca03ecd229ab34080f7fc040418c7075933",
      "size": 101
    },
    "assets/logo.png": {
      "sha256": "87de22ea82764b9bbbc2de6840518f80eca86e8af51e406f9ba5283b2bd3b9fa",
      "size": 10425
    },
    "mcp.json": {
      "sha256": "330035c23f4e4834aec8936e428b3800da68267393739c79d3fab333f5777ca5",
      "size": 196
    },
    "plugin.json": {
      "sha256": "d1b4e45932a114fcc0714e884efd62cdd69c609d04c2709a4dfdb18db58491df",
      "size": 2242
    },
    "skills/auth-and-quota/SKILL.md": {
      "sha256": "18ce5fd0733830f9ffec0dcdd23caea7bab320ae8d5a079d6a9d7ef26cf86288",
      "size": 4712
    },
    "skills/auth-and-quota/agents/openai.yaml": {
      "sha256": "6038f65651101cbc2115c28e347c17deba523d0cc5009e1617e968294a5ef28f",
      "size": 221
    },
    "skills/cross-domain-briefing/SKILL.md": {
      "sha256": "5bff04a3c3b44f27e604a8b2aafb8b1a89b7d9a90e09619f4966cc013e938436",
      "size": 2115
    },
    "skills/cross-domain-briefing/agents/openai.yaml": {
      "sha256": "f54f8ce1d0d94e1d3f4acb5c5e764680cce656453d72d3e2a1ccec55991e4ea2",
      "size": 241
    },
    "skills/discover-and-call/SKILL.md": {
      "sha256": "b7a648fd1ce2e39612ef509c37c9202b74469e467371fa5780c02e02f15937fb",
      "size": 5245
    },
    "skills/discover-and-call/agents/openai.yaml": {
      "sha256": "2c4bb1d37b8f426651a4472614f2caa972fc42f2668c315adf1ffacbcf84f551",
      "size": 226
    },
    "skills/envelope-and-attribution/SKILL.md": {
      "sha256": "e5241b9d8dea55b47251db85c0cc500d08abb272c3f242c4715103b1a92715c9",
      "size": 6008
    },
    "skills/envelope-and-attribution/agents/openai.yaml": {
      "sha256": "10834f55e183cd43bb1be1e3f2a47ce2ea1a6e2839804dfe8c585867d67b8154",
      "size": 241
    },
    "skills/live-docs/SKILL.md": {
      "sha256": "3af18eb9cdcd0e483206df7b0fbeea66441b4c6be5c3c59e6832dd7e74718b85",
      "size": 2609
    },
    "skills/live-docs/agents/openai.yaml": {
      "sha256": "bbd8b385c43aa8b4017cd7eea32f39d4997438da1b24587b6ab16560aaf41908",
      "size": 213
    },
    "skills/using-sugra-api/SKILL.md": {
      "sha256": "d981b6e137cf06a1d2bd8380f2ab9659ad99c0249f4b9bf46efa14ed6e616d9c",
      "size": 2918
    },
    "skills/using-sugra-api/agents/openai.yaml": {
      "sha256": "544c62aa8e5122875b31ac6834d398bb4e30920a862383b5e477eba190162537",
      "size": 212
    }
  }
}

SHA-256 of public snapshot: cc65924b70b2d99af409d6b15388e85e5c4ae687616835336a0d06f84cb1f3da