BLUEBERRIES PUBLIC API v1.0

Connect your data.
Expand your possibilities.

Bring Dashboard data into your applications. Explore the endpoints, set up access, and build your first integration.

Get startedFrom your first key to your first request.API referenceEndpoints, parameters, and responses.Your accessManage keys and test with your session.

Your Dashboard, connected.

Access all four Dashboard tabs through a read-only API with individual authentication and permissions for each data source.

↗4 dashboardsRetail, Imports, Exports, and AMS
{ }REST + JSONVersioned contracts under /v1
⌁Individual accessAPI keys with specific scopes

Your first request.

GET STARTED

Use a key from the Developer Portal with the dashboard:imports scope. Send it in the X-API-Key header.

GET /v1/dashboards/imports
curl --request GET \
  '/v1/dashboards/imports?period=365%20days&page=1&page_size=50' \
  --header "X-API-Key: ${BBI_API_KEY}"
Set BBI_API_KEY in your environment. The example uses this API's origin.

200 Example response JSON · synthetic data
{
  "dashboard": "imports",
  "filters": { "period": "365 days" },
  "fetched_at": "2026-11-03T12:00:00Z",
  "timezone": "UTC",
  "demo": true,
  "tiles": [{
    "id": "example",
    "title": "Synthetic local example (not industry data)",
    "data": [{ "date": "2026-01-01", "value": 100 }],
    "total": 1,
    "has_more": false
  }],
  "page": 1,
  "page_size": 50
}

A key for every integration.

Create a key in the Developer Portal and send it in the X-API-Key header. The key must be active, unexpired, and authorized for the requested Dashboard. Documentation is public; data requires authentication.

Sessions and API keys serve different purposes.

Your session provides portal access. API keys authenticate integrations. The playground uses your session and enforces the same access limits.

Dashboard permissions
Dashboard Required scope
Retail SPINS dashboard:retail
USDA Imports dashboard:imports
USDA FAS Exports dashboard:exports
USDA AMS dashboard:usda-ams

Permissions depend on the account and organization.

Explore the endpoints.

Browse the read-only dashboard data and filter endpoints. Expand an endpoint to view parameters, authentication, and responses directly from the OpenAPI specification.

Every metric, explained.

Fields, types, units, formulas, and caveats for all 29 tiles across the four adapters. Keys containing periods are literal JSON names; nested structures use brackets. The examples below are fictional, not source measurements. Measures may be numbers or decimal strings depending on the underlying BigQuery type. lb means pounds, USD means U.S. dollars, percent uses 25 for 25%, and ratio uses 0.25 for 25%.

In demo mode, responses contain only the generic example tile. OpenAPI defines this format separately from adapter responses. Synthetic data does not represent real metrics.

Request only what you need.

Common read parameters
Parameter Default Behavior
period 365 days 28, 84, 182, or 365 days. Imports accepts only 365 days.
page 1 1 through 100. Rows in each tile are paginated independently.
page_size 50 1 through 100 rows per tile.

Continue requesting pages while any tile returns has_more: true. Rows are sorted lexicographically by their JSON representation. All dates use UTC; fetched_at indicates when the API retrieved the response, not when the source was updated.

The Imports period is pre-aggregated.

The source represents the current period and does not apply shorter windows. Values other than 365 days are rejected because they would not filter the data.

Pagination has a limit.

Each query supports up to 100 pages. If has_more is still true on page 100, this version provides no further continuation: narrow the supported filters or contact support. This is not a bulk export endpoint.

Limits for this installation.

Values come from this API's published specification and reflect the running configuration. Costs: Dashboard = 5 units; filters = 1. Cache hits also consume the budget.

Windows are fixed using the Redis clock. Near window boundaries, up to twice the admissions may occur over a short interval. These limits control usage; they do not guarantee capacity or an SLA. Concurrency is checked after the budget and may reject a request that has already been counted.

Understand every response.

Use error.code for recovery logic; the text of error.message may change. X-Request-ID and error.request_id identify the same request. Unavailable readiness is an exception: it returns {"status":"unavailable"}, without an error envelope.

Errors before the application layer (network, TLS, or proxy) may not be JSON or include a request ID. After a timeout, check the state before automatically retrying mutations.

A versioned contract.

Identify and organize tiles by ID; legacy titles are not formulas. Ignore unknown new fields. Published strict schemas describe the current version and should be updated alongside the specification.

The server automatically exposes HEAD for GET routes: it uses the same authentication and may apply the same controls and costs, but returns no body. Use GET to retrieve dashboard data.

Read, import, and validate.

This page is the human-readable guide. OpenAPI is the technical contract in JSON: tools can import routes, schemas, authentication, parameters, and responses. It is public and contains no issued credentials or customer data.

Using Postman

  1. Import the collection or OpenAPI specification. The file includes this installation's origin; update base_url when switching environments.
  2. Set api_key locally to the key issued in the Developer Portal.
  3. Keep the populated api_key variable local.

cURL example variables

Set these only in your environment; the documentation does not provide these values
Variable Expected value
BBI_API_KEY Your full key secret.

Administrative and metrics routes have a separate, protected specification at /internal/openapi.json, with ADMIN_TOKEN and network restrictions. METRICS_TOKEN is independent. These tokens are never distributed to the portal.