anySKU for groups

For church networks, market associations, schools and other groups that run events on anySKU: bring your events, sales and sellers into your own website and records.

What you can build

Four ways to bring your group's events into your own site and records. The first needs no key.

1

Your public website

Your upcoming events, live totals and QR codes, with no key at all.

2

Your own records

Every event, seller and order at your events, and your organizations' share, read with a key from your server.

3

Live updates

A short signed notice to your server when an order is placed or collected, a seller joins, or a share is paid.

4

Each seller's own history

Sellers can choose to connect their anySKU account to your site, so you can show them their own sales at your events.

Buyers are never identified

You see sellers' usernames and what sold, never who bought. And anySKU treats an organizer's share as a commission on sales, not a donation. Any gift, receipt or tax letter you issue is your own, and must not be in anySKU's name (see the Partner Agreement).

1. Getting access

An administrator agrees to the Partner Agreement, we switch it on, and keys are made on your group's page.

  1. One of your group's administrators opens https://www.anysku.com/g/your-group/manage, goes to API access, agrees to the anySKU Partner Agreement for the group, and presses Request API access.
  2. We switch it on, usually within a day.
  3. The same page now lets an administrator create a key: give it a name, tick what it can read, choose how long it lasts. Administrators are emailed 30 and 7 days before a key expires.
  4. The key (ask_live_…) is shown once. Keep it on your server, never in a web page or app. Every administrator is emailed when a key is created or revoked. If one leaks, revoke it on the same page; it stops working within a minute.

Send the key on every request:

curl -H "Authorization: Bearer ask_live_..." https://app-api.anysku.com/api/partner/v1/events

Up to 120 requests a minute per key. Past that you get 429 with {"error":"Rate limit exceeded","retryAfterSeconds":60}.

2. Your public numbers (no key)

Safe to call from a web page: no key, open to every site.

For your own website and slides. Safe to call from a web page.

GET https://app-api.anysku.com/api/v1/collectives/{your-group}
GET https://app-api.anysku.com/api/v1/collectives/{your-group}/events?status=current|live|upcoming|ended
GET https://app-api.anysku.com/api/v1/collectives/{your-group}/stats
GET https://app-api.anysku.com/api/v1/collectives/{your-group}/events/{id}/qr?target=event|flyer&format=svg|png

Only listed events appear. Money totals appear only if your group switched public totals on (manage page), and only count listed events with at least three sellers, so no one seller's sales can be worked out.

3. Reading your group's records (key)

From your server only, with a key limited to what it needs.

All under https://app-api.anysku.com/api/partner/v1. A key only ever sees its own group's events; another group's event is a plain 404. Dates in the query are yyyy-MM-dd (by event start); times in responses are UTC; money is US dollars.

Events (tick "Events and members")

GET /events?from=2026-09-01&to=2026-12-31
GET /events/{id}
GET /events/{id}/links
GET /events/{id}/qr?target=event|flyer|join&format=svg|png
GET /members

Each event has Id, Name, HostUsername, StartsOn, EndsOn, Status (upcoming, live, ended), IsListed, Url, Sellers and a Summary (orders, collected, to collect, sales, and your share pending, earned and paid). The seller join link and its QR also need Seller invite links ticked: anyone with that link can sign up to sell at the event.

Sales (tick "Sales, by seller and order")

GET /events/{id}/sellers
GET /events/{id}/sales?pageSize=100&cursor=...&updatedSince=2026-10-04T00:00:00Z

Per seller: Username, ExternalRef (see step 5), spot, items, orders, sales and share. Per order: OrderNumber (the stable reference), OrderedOn, Seller, Items, Sales, ShareRate, Share, Status (to_collect, awaiting_buyer, collected, refunded, cancelled), ShareStatus (none, pending, earned, paid, void), CollectedOn, SharePaidOn, UpdatedOn.

Your share (tick "The organizations' share")

GET /payouts?from=2026-09-01&to=2026-12-31&pageSize=100&cursor=...

Every order with a share, across your events: the event, order number, seller, share, where it stands and when it was paid.

Paging and keeping in sync

Lists come back oldest first as {"Items":[...],"NextCursor":"..."}. Pass NextCursor back as cursor until it's null. pageSize is up to 200 (100 by default). To stay in sync, remember when you last asked and pass it as updatedSince: you get only orders that changed since (collected, cancelled, refunded, share paid).

When something's wrong

401 {"error":"unauthorized", ...}                  no key, or it's revoked, expired or switched off
403 {"error":"missing_permission","permission":"reports:read", ...}   the key wasn't given that box
404 {"error":"not_found"}                            not one of your group's events
429 {"error":"Rate limit exceeded","retryAfterSeconds":60}

4. Live updates (webhooks)

Hear about changes within a minute instead of checking for them.

On the manage page, add up to five https addresses and choose what to hear about. Within about a minute of a change, anySKU POSTs a short notice. It only says what changed; read the details with your key. We compare against what we saw about a minute earlier, so something undone within that minute, like a seller who joins and leaves straight away, sends nothing.

{ "id": "6f1c...", "type": "order.collected", "createdAt": "2026-10-04T15:02:11Z",
  "collective": "your-group", "data": { "eventId": "...", "orderNumber": "SO-10442", "seller": "maplecrafts" } }

Types: event.affiliated, event.started, event.ended, event.unlinked, seller.joined, seller.left, order.placed, order.collected, order.cancelled, order.refunded, share.paid, and webhook.test (the Send test button).

Check every notice is really from anySKU

Each one carries AnySku-Signature: t=1696431731,v1=5f2b.... Compute HMAC-SHA256 with your endpoint's signing secret (whsec_…, shown once when you add it) over t + "." + the raw body, compare with v1 in constant time, and reject anything with a t more than five minutes old.

// Node.js
const crypto = require('crypto');
function isFromAnySku(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = crypto.createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

Answer with any 2xx quickly. Otherwise we retry after 1 minute, 5 minutes, 30 minutes, 2, 6, 12 and 24 hours, sending the same id each time (use it to ignore repeats). After 50 failures in a row the address is switched off until an administrator turns it back on. Redirects aren't followed, and addresses must be on the public internet.

5. Connecting your sellers' accounts

Sellers choose to connect, see exactly what your site may read, and can disconnect any time.

So a seller can see their own sales at your events on your site. They choose to connect, see exactly what you'll get, and can disconnect any time from Connected apps in their account. You only ever get that seller's own sales at your group's events. This is standard OAuth 2 with a code and PKCE.

Register your app

On the manage page, open Apps, register your app with the address anySKU sends sellers back to, and agree to the Developer Agreement. You get a client ID (app_…) and a secret (apsec_…, shown once). Until anySKU reviews it, only your group's own members can connect, which is enough to build and test. Send it for review from the same page when it's ready.

1. Send the seller to anySKU

https://www.anysku.com/oauth/authorize?response_type=code
  &client_id=app_...
  &redirect_uri=https://yoursite.org/anysku/callback
  &scope=reports:read offline_access
  &state=RANDOM_VALUE_YOU_CHECK_LATER
  &code_challenge=BASE64URL(SHA256(verifier))&code_challenge_method=S256
  &external_ref=YOUR_ID_FOR_THIS_PERSON

external_ref is optional: your own ID for the person (up to 100 characters). It comes back with their data and on your sellers report, so you never have to match people by name.

2. Swap the code for tokens (from your server)

The seller comes back to your address with ?code=...&state=.... Check state, then:

curl -X POST https://www.anysku.com/oauth/token \
  -d grant_type=authorization_code -d code=CODE \
  -d redirect_uri=https://yoursite.org/anysku/callback \
  -d code_verifier=VERIFIER -d client_id=app_... -d client_secret=apsec_...

You get access_token (one hour) and refresh_token (30 days, renewed each time you use it). Refresh with grant_type=refresh_token&refresh_token=... plus your client ID and secret. If the seller disconnects, refreshing fails with invalid_grant: stop and delete what you hold for them.

3. Read their sales

curl -H "Authorization: Bearer ACCESS_TOKEN" https://app-api.anysku.com/api/partner/v1/member
curl -H "Authorization: Bearer ACCESS_TOKEN" "https://app-api.anysku.com/api/partner/v1/member/sales?from=2026-01-01"

/member returns Username, ExternalRef and ConnectedOn. /member/sales is paged like the other lists; each sale also names its event.

Ready to connect your group?

Every endpoint and field is in the interactive reference. Read the Partner Agreement and Developer Agreement, see the public listings API, or write to support@anysku.com.

Close
Back
Menu
Close
Set Location

Available items and pick up options will change based on your location:

Use current location
Close
Calendar
{0:ddd, MMM d}
12:00a
1:00a
2:00a
3:00a
4:00a
5:00a
6:00a
7:00a
8:00a
9:00a
10:00a
11:00a
12:00p
1:00p
2:00p
3:00p
4:00p
5:00p
6:00p
7:00p
8:00p
9:00p
10:00p
11:00p
Close
Back
Buy Options
Showcase By @

Showcase View full details →
@
0 followers
Follow
View
Ask the seller about this item

Currently out of stock

This item isn't available right now. Follow the seller or save it to your watchlist to stay updated.

Listed market value

On display

This item is part of the seller's collection and isn't listed for sale or offers right now.

Follow the seller to stay updated if this or similar items become available.

Example listing

This is a sample store, so this item isn't for sale. It shows what your own listings can look like.

Not available right now

The seller isn't offering this for meetup or event pickup at the moment.

-
+
0 available Out of stock Pre-order available for additional stock This is your listing
$0.00
Remove from cart
0 in cart
Add to Cart
-
+
0 available Out of stock Pre-order available for additional stock This is your listing
At checkout, you'll suggest what you'd like to pay.
Remove from cart
0 in cart
Add to Cart
-
+
0 available Out of stock Pre-order available for additional stock This is your listing
$0.00
Remove from cart
0 in cart
Add to Cart
or name your price instead
Seller only accepts cash

This is your listing

You're viewing your listing as buyers see it.

Attribute
Value
@
0 followers
Follow
View
Ask the seller about this item
1 added to cart
Change
Item Added
1 each
$0.00
$0.00 per each
Purchase
Ready for immediate purchase and checkout
Location in 00000 View map
Close
Back

Shopping Cart

Cart Total: $0.00
Close
Back

My Watchlist

Close
Back

Recently Viewed

Close
Back

Following

Close
Back
Options

Loading...

Close
Back
Report

Loading...

What's the problem?

Pick what best describes the issue

Anything else we should know?

Thanks for letting us know

We'll review this and take action if needed.

Close
Ask the seller

Loading...

Ask about this item

Only you and the seller see this. Their answer comes to your messages.

Question sent

We'll let you know when the seller answers.

Close
Options

Loading...

Close
Back
Report a Bug

Something not working right? Tell us what happened and we'll look into it.

A screenshot of the current page helps us find the problem faster.
Attach screenshot

Your Privacy Choices

Close
Help us improve the platform by allowing anonymous usage analytics
We never sell your data. Disabling analytics does not affect essential cookies. Privacy Policy