{
  "version": "plans-2026.1",
  "effectiveDate": "2026-09-21",
  "note": "The plan catalogue is DATA, not code. Limits are read from here at boot, so changing a quota is a data edit and a redeploy, never a code change. Served at /grapes/api/v1/plans.json and /grapes/v1/plans.",
  "currency": "USD",
  "model": "Every plan has EVERY feature. Plans differ only in how much you may use, never in what you may reach. No endpoint, field or dataset is reserved for a paying customer — a higher plan raises limits and nothing else. History is the same: every plan can query it, and a paid plan buys how far back. And where the limits are the only obstacle to public-interest work, they are lifted for free — see publicInterest.",
  "dataIsPublicDomain": "Nothing in any paid plan is a licence to the data. Wikidata's structured data is CC0 and 27 CFR part 4 is a work of the United States Government; every record here is free on every plan, at full fidelity, and you may redistribute it commercially without asking. A paid plan buys CAPACITY and HISTORICAL DEPTH on a shared server, never access.",
  "billing": {
    "status": "not-yet-available",
    "provider": "paypal",
    "note": "Paid plans are not live. No payment code runs in this service and no card or PayPal credential ever reaches it. When paid plans open they will be served from a separate domain backed by this same API, and subscriptions will be handled by PayPal Subscriptions; this service will only ever receive a signature-verified webhook that issues or revokes an API key.",
    "interestUrl": "https://apis.allanninal.dev/grapes/pro.html"
  },
  "featureCatalogue": {
    "varieties.read": "Search and fetch global grape varieties: berry colour, species, country of origin, parentage, and VIVC and Wikidata cross-references.",
    "relationships.read": "The variety-to-wine co-occurrence graph from Wikidata P186, labelled as claims rather than rules.",
    "rules.read": "The US composition thresholds from 27 CFR part 4 — the 75% varietal rule, the 85% appellation rule, vintage rules — with citations.",
    "quality.read": "The published register of known-bad upstream claims, colour conflicts and coverage gaps.",
    "bulk.download": "The complete datasets as static JSON files, cacheable and unmetered.",
    "history.asof": "Query the corpus as it stood on a past date. Wikidata publishes no dated snapshot, so this exists only because this service retains one.",
    "history.changes": "A change feed: which varieties, claims or rules moved since a date."
  },
  "limitDefinitions": {
    "requestsPerMinute": "Requests accepted in a rolling minute, per IP on the anonymous plan and per key otherwise.",
    "requestsPerDay": "Requests accepted in a rolling day, same identity.",
    "maxPageSize": "Largest value accepted for ?limit= on a search endpoint.",
    "bulkDownloadsPerDay": "Full static-dataset file downloads accepted per day (/api/v1/*.json). The files are free and complete; this caps how often one identity may re-pull them, because the cost is bandwidth. The per-record API under /v1 is counted separately.",
    "historyDays": "How far back ?asOf= and the change feed may reach, in days before today. null means the full retained history. Every plan can use both endpoints; this caps the depth, not the capability."
  },
  "plans": [
    {
      "id": "free",
      "name": "Free",
      "tagline": "Everything, no signup.",
      "price": {
        "monthly": 0,
        "annual": 0,
        "currency": "USD"
      },
      "signupRequired": false,
      "available": true,
      "limits": {
        "requestsPerMinute": 60,
        "requestsPerDay": 5000,
        "maxPageSize": 100,
        "bulkDownloadsPerDay": 50,
        "historyDays": 30
      },
      "features": [
        "varieties.read",
        "relationships.read",
        "rules.read",
        "quality.read",
        "bulk.download",
        "history.asof",
        "history.changes"
      ],
      "description": "Anonymous, budgeted by IP. Every variety, every claim and every rule at full fidelity, the complete static files, and the last 30 days of history. This is not a trial — it is the product.",
      "upgradeReason": null
    },
    {
      "id": "free-key",
      "name": "Free (with key)",
      "tagline": "Same data, a bigger budget.",
      "price": {
        "monthly": 0,
        "annual": 0,
        "currency": "USD"
      },
      "signupRequired": true,
      "available": true,
      "limits": {
        "requestsPerMinute": 300,
        "requestsPerDay": 50000,
        "maxPageSize": 100,
        "bulkDownloadsPerDay": 500,
        "historyDays": 30
      },
      "features": [
        "varieties.read",
        "relationships.read",
        "rules.read",
        "quality.read",
        "bulk.download",
        "history.asof",
        "history.changes"
      ],
      "description": "Ask for a key and the per-IP budget becomes a per-key budget ten times the size. Nothing else changes: a key does not unlock a field, a route or a record.",
      "upgradeReason": "You are hitting the anonymous per-IP limit."
    },
    {
      "id": "pro",
      "name": "Pro",
      "tagline": "Production volume and the full archive.",
      "price": {
        "monthly": 19,
        "annual": 190,
        "currency": "USD",
        "annualNote": "two months free"
      },
      "signupRequired": true,
      "available": false,
      "limits": {
        "requestsPerMinute": 1200,
        "requestsPerDay": 500000,
        "maxPageSize": 1000,
        "bulkDownloadsPerDay": 5000,
        "historyDays": null
      },
      "features": [
        "varieties.read",
        "relationships.read",
        "rules.read",
        "quality.read",
        "bulk.download",
        "history.asof",
        "history.changes"
      ],
      "description": "The same endpoints and the same data, at production request rates, with history reaching back as far as this service has retained it rather than 30 days.",
      "upgradeReason": "You need production request rates, or history older than 30 days."
    },
    {
      "id": "business",
      "name": "Business",
      "tagline": "Headroom for a platform.",
      "price": {
        "monthly": 49,
        "annual": 490,
        "currency": "USD",
        "annualNote": "two months free"
      },
      "signupRequired": true,
      "available": false,
      "limits": {
        "requestsPerMinute": 6000,
        "requestsPerDay": 5000000,
        "maxPageSize": 5000,
        "bulkDownloadsPerDay": 50000,
        "historyDays": null
      },
      "features": [
        "varieties.read",
        "relationships.read",
        "rules.read",
        "quality.read",
        "bulk.download",
        "history.asof",
        "history.changes"
      ],
      "description": "For putting this behind your own product. Still the same data and the same routes; the ceiling is simply high enough to stop thinking about.",
      "upgradeReason": "You are serving this to your own users and Pro's ceiling is in the way."
    },
    {
      "id": "public-interest",
      "name": "Public interest",
      "tagline": "Pro capability, free, by application.",
      "price": {
        "monthly": 0,
        "annual": 0,
        "currency": "USD"
      },
      "signupRequired": true,
      "available": true,
      "applicationRequired": true,
      "inUpgradeLadder": false,
      "limits": {
        "requestsPerMinute": 1200,
        "requestsPerDay": 500000,
        "maxPageSize": 1000,
        "bulkDownloadsPerDay": 5000,
        "historyDays": null
      },
      "features": [
        "varieties.read",
        "relationships.read",
        "rules.read",
        "quality.read",
        "bulk.download",
        "history.asof",
        "history.changes"
      ],
      "description": "Pro limits and full history at no cost, for journalists, academics, nonprofits and public-interest researchers.",
      "eligibility": [
        "Wine educators, sommelier courses and their students.",
        "Academic researchers in viticulture, ampelography or food policy.",
        "Nonprofits and civic-technology projects republishing public-domain reference data.",
        "Independent label designers and small importers, where the free limits are genuinely in the way.",
        "Journalists reporting on wine, agriculture or labelling regulation."
      ],
      "howToApply": "Message the author at https://www.linkedin.com/in/allanninal/ saying what you are working on. No proposal, no procurement, no annual review.",
      "support": "Best effort, same as every other plan.",
      "upgradeReason": "The free limits are in the way of public-interest work."
    }
  ],
  "fairUse": "The free plans are genuinely free and are not a trial. They are rate limited so one caller cannot take the service down for everyone — the scarce resource is a single shared host, not the data, which is public domain and which you are free to download in full and host yourself.",
  "selfHostNote": "If you need more than any plan offers, do not buy one: the complete datasets are published at /grapes/api/v1/ and the server is MIT licensed. Run your own copy — and the upstream is Wikidata's public SPARQL endpoint, which you can query directly. A rate limit is a property of my hardware, not a property of the data.",
  "whyHistoryIsSold": "Wikidata is edited continuously and publishes no dated snapshot of its query service. What a grape record said last month is not retrievable from the endpoint — the page history exists, but no dated view of the corpus does. So a caller cannot tell whether a value changed, or when, or what it was. This service overwrites nothing: it captures each refresh and can answer what was true when. That retained history is the one thing here that is genuinely mine to sell — it is work performed, not a public record put behind a gate.",
  "historyNote": "Historical depth is limited by when this service started retaining snapshots, not by your plan alone. /v1/history/coverage reports the real window; no plan can answer for a date before we started looking, and this service will never invent one.",
  "publicInterest": {
    "summary": "Pro-level access is free for journalists, academics, nonprofits and public-interest researchers. Ask and it is granted.",
    "why": "This is CC0 reference data about the plants most of the world's wine is made from, joined to the public law that governs what a bottle may be called. The people most likely to do something useful with it — wine educators, sommelier students, small label designers, researchers — are the least likely to have a budget for an API. Charging them would select against exactly the use this data exists for. The rate limits exist to protect one small shared server, not to ration a public-domain corpus, so where the limit is the only obstacle it is simply lifted.",
    "contact": "https://www.linkedin.com/in/allanninal/",
    "note": "No proposal, no procurement, no annual review. Contact is via LinkedIn rather than email, so the author can see a real person is asking. If the free tier's limits are in your way and you are doing work of this kind, say so and you will get a key.",
    "contactVia": "LinkedIn"
  },
  "pricingRationale": {
    "summary": "Priced low on purpose. The variety data is CC0 and queryable directly from Wikidata's public SPARQL endpoint by anyone, so what is sold here is convenience, normalisation and retained history — not access. A price that pretended otherwise would be charging for something I do not own.",
    "comparedWith": [
      {
        "vendor": "Wikidata Query Service (the upstream itself)",
        "url": "https://query.wikidata.org/",
        "verifiedOn": "2026-09-21",
        "theirTiers": [
          {
            "name": "Public SPARQL endpoint",
            "monthly": 0,
            "notes": "Free, keyless, no account. Hard 60s query timeout, no SLA, and a user-agent policy."
          }
        ],
        "trial": "n/a — it is free.",
        "theyHaveThatWeDoNot": [
          "All of Wikidata, not 2,782 grape entities.",
          "Arbitrary SPARQL — any query you can express, not a fixed set of routes.",
          "Live data with no refresh lag.",
          "Federation with other SPARQL endpoints."
        ],
        "weHaveThatTheyDoNot": [
          "Normalisation: 41 free-text colour spellings collapsed to a 5-value vocabulary, with every raw value preserved and 146 upstream conflicts reported rather than resolved.",
          "Retained history. Wikidata publishes no dated snapshot of its query service; this service captures each refresh, so ?asOf= and a change feed are possible at all.",
          "A published register of known-bad claims, so the error rate is visible rather than discovered.",
          "The US 27 CFR part 4 labelling thresholds joined to the same corpus.",
          "No 60-second timeout, no SPARQL required, and a stable contract."
        ],
        "honestly": "Wikidata already publishes all of this, free, keyless and more capable than this service in every dimension except normalisation and retained history. Anyone comfortable writing SPARQL should query it directly. Serving the current state of a CC0 corpus is therefore not a differentiator here — the normalisation and the archive are, and saying otherwise would be selling a wrapper as a moat."
      }
    ],
    "whyThisNumber": "$19 is the price of a thing you expense without asking anyone. The upstream cost nothing to acquire; the cost of running this is a share of one small VPS. The price reflects the capacity and the retention, which are the only things here that are actually mine.",
    "whatCapsIt": "Every dataset here is CC0 or public domain and published in full as static files, the server is MIT licensed, and the upstream SPARQL endpoint is free and public. Anyone who finds a plan expensive can self-host or query Wikidata directly and pay nothing. That is a deliberate ceiling on what this can ever charge, and it is the right one.",
    "alsoLookedAt": [
      {
        "vendor": "USITC HTS reststop",
        "url": "https://hts.usitc.gov/reststop/",
        "note": "Free and keyless, and it is where this service's schedule comes from. It serves only the CURRENT revision, returns display strings rather than computable amounts, and has no archive — which is precisely the gap this service fills."
      },
      {
        "vendor": "SimplyDuty",
        "url": "https://www.simplyduty.com/pricing/",
        "note": "Pay-as-you-go duty and tax calculation across countries. Broader than this service and not wine-specific; pricing is per-call rather than per-month."
      },
      {
        "vendor": "Zonos",
        "url": "https://zonos.com/pricing",
        "note": "Landed-cost platform aimed at cross-border ecommerce checkout. A different product entirely — it prices a cart, not a customs entry."
      }
    ]
  },
  "contact": {
    "via": "LinkedIn",
    "url": "https://www.linkedin.com/in/allanninal/",
    "note": "There is no public email address for this service. Reach the author on LinkedIn."
  }
}
