← Back to blog
TutorialNov 15, 2025 · 9 min read

Building a Release Calendar with /releases/upcoming

The /v1/releases/upcoming endpoint returns sneakers with confirmed future release dates. Here's how to turn that into a release calendar in your app.

Basic fetch

const res = await fetch(
  'https://graildata-api-production.up.railway.app/v1/releases/upcoming?limit=50',
  { headers: { 'X-API-Key': process.env.GRAILDATA_API_KEY! } }
);
const { items } = await res.json();

Each item is a full sneaker object with release_date, release_type, release_regions, and hype_score fields.

Grouping by date

const byDate = items.reduce((acc, sneaker) => {
  const date = sneaker.release_date ?? 'TBA';
  if (!acc[date]) acc[date] = [];
  acc[date].push(sneaker);
  return acc;
}, {} as Record<string, typeof items>);

const sorted = Object.entries(byDate).sort(([a], [b]) => {
  if (a === 'TBA') return 1;
  if (b === 'TBA') return -1;
  return new Date(a).getTime() - new Date(b).getTime();
});

Timezone edge cases

Release dates are stored as calendar dates (2026-03-15), not timestamps. Nike SNKRS drops at 10am in the buyer's local time. Don't assume UTC — display the date without a time component unless you know the exact drop time for that release.

Filtering by region

Use release_regions to filter drops relevant to your users. A global release includes all regions; a US-only SNKRS exclusive won't include EU or APAC.

const usDrops = items.filter(s => s.release_regions.includes('US'));

Ready to start building?