SPB Git forge

spb/market-atlas

Public
12commits 1branches 0releases
1.1 MBsize
maindefault branch
10 days agolast push
TypeScript 96.7% SQL 1.6% CSS 0.8% JavaScript 0.5%
4.7 KB · 107 lines tsx
Raw Blame History
1import type { Metadata } from "next";2import Link from "next/link";3import { Page, PageHeader } from "@/components/ui/section";4import { RightsBadge } from "@/components/ui/status-badge";5import { apiOptional } from "@/lib/api";6import { DISCLAIMER } from "@/lib/site";7import type { Source } from "@/lib/types";89export const metadata: Metadata = { title: "Data rights & licensing", description: "How Market Atlas classifies the rights attached to every source and what each status allows.", alternates: { canonical: "/licensing" } };10export const dynamic = "force-dynamic";1112const STATUSES: Array<[string, string]> = [13  ["PUBLIC_OPEN", "Public data with no usage restriction known to us."],14  ["PUBLIC_ATTRIBUTED", "Public data displayed with attribution to the source (venue feeds, reference files). Not for raw-feed commercial redistribution."],15  ["OFFICIAL_OPEN_DATA", "Government or central-bank open data (public domain or open licence with attribution)."],16  ["LICENSED", "Data licensed to Market Atlas (including our sister platform HF Market Data) — redistribution within the licence."],17  ["DELAYED", "Delayed market data that may be displayed publicly with attribution and a delay notice (Cboe: 15 minutes)."],18  ["INDICATIVE", "Indicative values (reference fixings, averages) — informational, not tradable."],19  ["PUBLIC_RESTRICTED_REDISTRIBUTION", "Publicly accessible but redistribution is restricted: used internally for validation only; public values are withheld."],20  ["RESEARCH_ONLY", "Usable for internal research; never displayed."],21  ["INTERNAL_ONLY", "Internal signals (Market Atlas' own calendar/monitoring) or values built only from restricted sources."],22  ["UNKNOWN", "Rights not yet classified — never exposed publicly until reviewed."],23];2425export default async function LicensingPage() {26  const sources = (await apiOptional<Source[]>("/v1/sources"))?.filter((s) => s.category !== "INTERNAL") ?? [];27  return (28    <Page>29      <PageHeader kicker="Legal" title="Data rights & licensing" lead="Technical accessibility does not imply redistribution rights. Every connector declares a rights status; the platform enforces it — quotes built only from restricted sources are withheld, while their provenance metadata stays visible." />30      <div className="prose-ma max-w-3xl">31        <h2>Rights statuses</h2>32        <table>33          <thead>34            <tr>35              <th>Status</th>36              <th>What it means</th>37            </tr>38          </thead>39          <tbody>40            {STATUSES.map(([s, d]) => (41              <tr key={s}>42                <td>43                  <RightsBadge status={s} />44                  <code className="ml-2">{s}</code>45                </td>46                <td>{d}</td>47              </tr>48            ))}49          </tbody>50        </table>51        <h2>What Market Atlas never does</h2>52        <ul>53          <li>Bypass authentication, paywalls, CAPTCHAs or access controls; impersonate users; use leaked credentials or private sessions.</li>54          <li>Reverse-engineer protected feeds for unauthorized redistribution or evade a source's restrictions.</li>55          <li>Present delayed, end-of-day or stale values as real time.</li>56        </ul>57        <h2>Attributions</h2>58        {sources.length ? (59          <table>60            <thead>61              <tr>62                <th>Source</th>63                <th>Rights</th>64                <th>Notes</th>65              </tr>66            </thead>67            <tbody>68              {sources.map((s) => (69                <tr key={s.id}>70                  <td>71                    {s.homepage ? (72                      <a href={s.homepage} target="_blank" rel="noopener noreferrer">73                        {s.name}74                      </a>75                    ) : (76                      s.name77                    )}78                    <div className="text-xs text-ink-3">{s.organization}</div>79                  </td>80                  <td>81                    <RightsBadge status={s.rights_status} />82                  </td>83                  <td>84                    {s.rights_notes}85                    {s.terms_url && (86                      <>87                        {" "}88                        <a href={s.terms_url} target="_blank" rel="noopener noreferrer">89                          terms ↗90                        </a>91                      </>92                    )}93                  </td>94                </tr>95              ))}96            </tbody>97          </table>98        ) : (99          <p>Source attributions are listed on the <Link href="/sources">sources</Link> page.</p>100        )}101        <h2>Disclaimer</h2>102        <p>{DISCLAIMER} Final legal language will be reviewed before any commercial launch.</p>103      </div>104    </Page>105  );106}107