API & Widgets

Group stats for your website, blog or profile: raw JSON and restylable copy-paste widgets.

Endpoints

Read-only JSON over GET with open CORS works in browsers on any site.

Base URL https://detf.com. Publicly hidden groups stay hidden here.

GET/api/v1/groups/{id}/statsno key

Public group stats: members, proposals by status, votes cast, hiring, stored treasury; cached ~5 minutes.

GET/api/v1/users/{username}/groupsno key

A member's listed groups, each with public stats and their tier, role and member-since.

GET/api/v1/me/groupsAPI key

All the key owner's groups, including hidden ones, with per-group contribution counts; uses the key's daily limit.

GET/api/v1/widgets/badge?group={id}&metric=membersno key

Script-free SVG badge for READMEs and forums. Metrics: members, votes, proposals, active, hiring. Optional label= and color= (hex).

GET/api/v1/store/items?group={id}no key

A listed group's sale items for your site: stored prices, options (sizes, colours) if any, plain pay links and checkout switches (shipping, promo codes). Repository-governing groups list items in .d8a's items: block; others use their Admin tab.

POST/api/v1/store/checkoutno key

{ group, item, quantity?, variant?, returnUrl? } or { group, lines: [{ item, quantity?, variant? }], returnUrl? } → { url }. One card checkout at stored prices, up to 20 cart lines; listed options require a selection. Any origin, 10/min per IP. Proceeds enter the group's shared credit balance; shipping address and promo codes follow its Admin-tab switches.

GET/api/v1/store/orders/{orderId}?group={id}no key

Verifies a paid order belongs to this group: { paid: true, order } or 404. Paid buyers return with ?d8a_order=<id>; the widget verifies it here and fires group-store:paid.

Example response

GET /api/v1/groups/{id}/statssample
{
  "group": {
    "id": "harbour-works",
    "name": "Harbour Works",
    "url": "https://detf.com/g/harbour-works",
    "logoUrl": "/uploads/harbour-works.png",
    "network": null,
    "createdAt": "2026-02-14T09:12:03.000Z"
  },
  "members": 128,
  "proposals": { "total": 41, "active": 3, "passed": 29, "rejected": 9 },
  "votesCast": 612,
  "hiringOpen": true,
  "treasuryUsd": 18400,
  "treasury": null,
  "updatedAt": "2026-08-11T07:45:00.000Z"
}

All widgets read this payload; Raw JSON prints it unchanged.

Keys & limits

Keys appear only at creation and can be revoked anytime.

Create keys in Settings → API & widgets.

Keyless endpoints

No key or daily quota. The ~5-minute group stats cache prevents overload and stale data. Badge and username lookups allow 300 requests/minute per viewer IP; excess JSON requests return 429 withRetry-After, while badges return 200 with a grey “rate limited” image, avoiding broken README images.

Keyed endpoints

Personal requests: 100/key/day, resetting midnight UTC. Rate headers (X-RateLimit-*) accompany every keyed response. Public-page keys are visible to every visitor: fetch server-side; revoke and replace leaked keys in Settings.

Treasury figures are maintained on group pages, never calculated on demand; missing stored figures return null.

Chat bots

Connect a chat account in Notifications. Send the bot /stats on Telegram or Discord (or DM stats where supported) for current stats across your groups; channels that can't receive commands offer an optional weekly digest.

Widgets

Copy plain HTML, CSS and JS that fetch the JSON above, replace the id and restyle — no installation.

All widgets below run live against a real group on this site.

Raw

Unstyled payload

Raw JSON

The whole response, pretty-printed. Everything below is this same payload, styled.

loading
Loading preview…
swap every YOUR_GROUP_ID

Full cards

Every stat, linked to group tabs

Hero banner

Gradient banner, big numbers, light body. Four palettes ship in the snippet comments.

loading
Loading preview…
swap every YOUR_GROUP_ID

Aurora glass

Animated gradient ring, glass stat tiles, pass-rate bar.

loading
Loading preview…
swap every YOUR_GROUP_ID

Code editor

The stats as syntax-highlighted JSON in an editor window.

loading
Loading preview…
swap every YOUR_GROUP_ID

Editorial

Stark magazine layout with a huge member count.

loading
Loading preview…
swap every YOUR_GROUP_ID

Compact

For footers, sidebars or READMEs

Stats card

The plain starting point — four numbers in a box, easiest to restyle.

loading
Loading preview…
swap every YOUR_GROUP_ID

Stats strip

One line of text for a footer, a sidebar, or under a headline.

loading
Loading preview…
swap every YOUR_GROUP_ID

Badge image

An SVG image, so it works where scripts don't — READMEs, forums, most blog engines.

loading
Loading badges…
swap every YOUR_GROUP_ID

Per person

One member's groups, not one group

Member's groups

Every listed group a username belongs to, with their role. Keyless.

sample
Loading preview…
swap every YOUR_USERNAME

My groups + contributions

Your own groups — hidden ones included — with what you've contributed to each. Needs a key.

sample
Loading preview…
swap YOUR_API_KEY

Sell

Buy buttons: card payments into your group's credit balance

Sell on your site

Your listed items with a Buy button each — card checkout, proceeds into the group's credit balance.

loading
Loading preview…
swap every YOUR_GROUP_ID