Brain Food
Push something your own system knows about — this week's specials, a sale, a new location — and DW's agents pick it up: a pinned, dated post goes into Hype's queue ahead of whatever was already planned, and the same material becomes something Quill and Press may draw on too, if it genuinely fits what they're already writing.
This exists because DW can't see what changes in YOUR system. A rotating specials roster, a timetable, a clearance list — none of that lives here, so none of it can be detected. It has to be pushed.
Why a push, not a pull #
DW never polls your site or scrapes a page to build this. Two reasons:
- We'd get it wrong the moment your page changes. A scraper reading prices off markup breaks silently on the first redesign and posts a wrong number with total confidence.
- You already computed the answer. If your system has a "this week's roster" view, that view is the one true source — sending it here is one call, not a second implementation of your own business logic.
Endpoint #
POST https://api.discoverworthy.com/graphqlStandard GraphQL over HTTP — same endpoint as the rest of the DiscoverWorthy
public API. Content-Type: application/json, body { "query": "...", "variables": {...} }.
Authentication #
Your site's secret key (dwsk_…), the same one every write mutation on this
API uses. Get one via the Rigg MCP tool dw_get_or_create_business_api_key
(mints if absent, returns the existing key otherwise), or in the developer
portal at https://api.discoverworthy.com → your site → Generate. It is
a server-side credential — never put it in a browser or a mobile app.
curl -H "Authorization: Bearer dwsk_..." -H "Content-Type: application/json" \
https://api.discoverworthy.com/graphql -d '{"query": "..."}'1. See what you can push #
query {
site {
brainFoodBlocks {
id
label
description
listShaped
mergeFields { key label required type example }
}
}
}This is the SAME catalog pushBrainFood validates against — it will never list
something the mutation then refuses, and it will never accept a field this
query didn't mention.
2. Push something #
mutation Push($input: BrainFoodInput!) {
pushBrainFood(input: $input) {
ok
error
occasionId
created
itemsAccepted
}
}Identity — read this before your first push. externalSource is who you
are ("your-system-name"); externalId is YOUR id for this specific push, not
ours. Push the same externalId again to correct something (the payload
updates in place, no second post is made). Push a new externalId for a new
thing — next week's roster, a different sale. That is the whole retry story: if
a request times out, resend it with the same id and you get the same occasion
back, not a duplicate.
{
"input": {
"type": "sale_promotion",
"externalSource": "my-system",
"externalId": "eofy-2026",
"validUntil": "2026-06-30",
"landingUrl": "https://example.com/sale",
"facts": { "offer": "20% off storewide", "endDate": "2026-06-30" }
}
}validUntil matters for anything time-bound: past this date the material
may not seed a new post, and a post already scheduled from it will not
publish — the queue never ships something you've since taken down.
landingUrl is where the post should send people, in a comment under the
post (never guessed — DW doesn't invent per-product URLs; state the page you
want).
3. A list-shaped push #
roster carries a list of items, not just fields. Each
item can carry a price, a "was" price, and a badge — all drawn straight onto the
slides. Nothing here is ever restated in words by a model: a wrong figure would
be a rendering bug, not a prompt problem, which is the whole point of drawing it
instead of writing it.
{
"input": {
"type": "roster",
"externalSource": "my-system",
"externalId": "homepage-roster-2026-W35",
"validUntil": "2026-08-31",
"landingUrl": "https://example.com/specials",
"facts": { "title": "This week's specials" },
"items": [
{
"sku": "ABC-123",
"name": "Cordless drill 18V",
"imageUrl": "https://example.com/img/drill.jpg",
"badgeLabel": "SPECIAL",
"priceCents": 12900,
"wasPriceCents": 18900,
"currency": "AUD"
}
]
}
}The block library #
Generated from the live catalog — every type listed here is pushable today.
business_birthday — Business birthday #
Mark another year in business on your founding date.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
businessName |
Business name | yes | text | GFM Accountants |
years |
Years in business | yes | text | 8 |
were_hiring — We're hiring #
Announce an open role.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
roleTitle |
Role | yes | text | Senior Electrician |
details |
About the role | no | text | full-time, Parramatta based, residential work |
review_received — Review received #
Share a great review or testimonial.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
reviewText |
Review | yes | text | Fantastic service… |
reviewerName |
Reviewer | no | text | Sarah C. |
customer_count_milestone — Customer milestone #
Celebrate a round-number customer count.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
count |
Count | yes | text | 100 |
award_won — Award won #
Announce an award win or finalist spot.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
awardName |
Award | yes | text | Local Business Awards finalist |
forWhat |
For what | no | text | customer service |
supplier_spotlight — Brand spotlight #
Feature one of the brands you stock, install or work with.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
supplier |
Which brand | yes | text | UNIMIG |
whatYouStock |
What you stock or install from them | no | text | MIG and multi-process machines |
whyThisBrand |
Why you carry them | no | text | the duty cycle holds up on site all day |
press_mention — Press mention #
Share a feature or mention in the press.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
outlet |
Outlet | yes | text | Sydney Morning Herald |
pieceAbout |
What the piece covers | no | text | our apprenticeship program |
partnership — Partnership announcement #
Announce a new partnership or supplier relationship.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
partnerName |
Partner | yes | text | BuildCo |
whatItMeans |
What it means for customers | no | text | faster turnaround on custom orders |
nth_order_milestone — Order / volume milestone #
Celebrate your Nth order, project, or delivery.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
count |
Count | yes | text | 1000 |
product_launch — Product / service launch #
Announce something new on the shelf.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
productName |
Product | yes | text | Winter range |
back_in_stock — Back in stock #
A popular product is available again.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
productName |
Product | yes | text | Bestseller hoodie |
sale_promotion — Sale / promotion #
Announce a sale — launch post plus a last-chance reminder.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
offer |
Offer | yes | text | 20% off storewide |
endDate |
Ends on | yes | date (YYYY-MM-DD) | 2026-07-20 |
new_location — New location / move #
Announce a move, new premises, or reopening.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
address |
Where | yes | text | 12 Main St, Parramatta |
holiday_hours — Holiday trading hours #
Tell customers your hours over a holiday period.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
hours |
Hours | yes | text | Closed 25-28 Dec, back Jan 2 |
dayName |
Holiday | no | text | Christmas |
new_equipment — New equipment / capability #
Show off a new truck, machine, or capability.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
whatArrived |
What arrived | yes | text | second service van |
public_holiday — Public holiday / industry day #
Mark holidays and industry days that fit your business.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
dayName |
Day | yes | text | International Coffee Day |
commercial_moment — Trading moment #
Ride the buying peaks — Father's Day, Black Friday, EOFY, Christmas cut-offs.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
momentName |
Moment | yes | text | Father's Day |
momentDate |
Date it falls | yes | text | 2026-09-06 |
angle |
About the day, market-wide (NOT a description of this business) | yes | text | A gifting weekend with late buyers, so delivery cut-offs decide it |
offer |
Your offer, if you have one | no | text | 15% off gift boxes until Friday |
cutoff |
Order-by / booking deadline | no | text | order by Wednesday for delivery |
year_in_review — Year in review / EOFY #
A look back at the year — calendar or financial.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
highlights |
Highlights worth mentioning | no | text | opened the second workshop, hit 200 customers |
period |
Period | no | text | the financial year |
event — Event #
An event you're hosting, attending, or speaking at — announce, remind, recap.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
eventName |
Event | yes | text | Parramatta Small Business Expo |
eventDate |
When | yes | text | Aug 14, from 10am |
whatsOn |
What’s happening | no | text | we’re speaking on solar rebates at 2pm |
community_event — What’s on #
Events you publish on your own website — announced, then reminded about the day before.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
eventName |
Event | yes | text | Twilight Fete |
eventDate |
When | yes | text | Friday 14 March, from 4pm |
eventPlace |
Where | no | text | the school oval |
whatsOn |
What’s happening | no | text | rides, cake stall and the senior band |
sponsorship — Sponsorship / community #
Community involvement, sponsorships, and charity support.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
whatSupported |
What you support | yes | text | the local under-12s soccer team |
roster — Roster #
A short list of things to put in front of people this week — specials, new arrivals, what’s on.
List-shaped — send items, not just facts. See "A list-shaped push" below.
| Field | What it is | Required | Type | Example |
|---|---|---|---|---|
title |
What this list is | yes | text | This week’s specials |
validUntil |
Good until | no | date (YYYY-MM-DD) | 2026-08-31 |
What you will never be able to push #
Types that name a real person or a client are excluded outright, always — not a
setting, not a scope you can request. They're gated on a consent bit held
against that person, which an outside system has no standing to assert on their
behalf. brainFoodBlocks will simply never list them.
Result shape #
{
"ok": true,
"occasionId": "3f9c...",
"created": true,
"knowledgeItemId": "9a1b...",
"itemsAccepted": 8
}A rejected push comes back { "ok": false, "error": "..." } rather than a
GraphQL error — an integration finding out which field was wrong is worth more
than a stack trace. knowledgeItemId is set when the material was also shared
with Quill and Press; it can be null even on a successful push (that share is
fail-open — your post still goes out if it fails).
Full schema: point any GraphQL client (or an LLM) at https://api.discoverworthy.com/graphql —
it is fully introspectable. This doc: https://app.discoverworthy.com/docs/api/brain-food ·
https://app.discoverworthy.com/docs/api/brain-food.md.