Portfolio consumers read versioned envelopes from eight local data-product APIs (`127.0.0.1:8101–8108`). No upstream scraping, no paid fallbacks, and no external writes from this app. Offline demos use sanitized fixtures.
Connecting to local data-product APIs…
Loading, stale, timeout, empty, and API-unavailable states
free_only=true · allow_paid_providers=false · allow_external_writes=false · offline tip: add ?fixtures=1
Applications consume contracts — data repos own ingestion
Independent domain APIs with normalized envelopes
No paid providers or automatic paid fallbacks
Development binds on 127.0.0.1:8101–8108
Apps read GET /v1/records only — never scrape
Sanitized offline envelopes for demos without network
Development loopback endpoints
No paid fallbacks · free-only defaults
If a local API times out or is unavailable, the UI falls back to sanitized fixtures under /data/data-products/.
Responses must include schema_version, source, retrieved_at, data_status, items, and next_cursor.
This consumer never sends Telegram, Todoist, or email. Writes stay disabled under free-only policy.
Legacy scraper-dashboard JSON is no longer the live source. This page consumes data-product API envelopes (or fixtures) only.