DW DiscoverWorthy API docs
.md llms.txt
Built for humans and LLMs. · Point your assistant at this page, hit Copy for LLM, or fetch the raw .md. Every type is introspectable, too.

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:

  1. 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.
  2. 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 #

Text
POST https://api.discoverworthy.com/graphql

Standard 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.

Shell
curl -H "Authorization: Bearer dwsk_..." -H "Content-Type: application/json" \
  https://api.discoverworthy.com/graphql -d '{"query": "..."}'

1. See what you can push #

GraphQL
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 #

GraphQL
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.

JSON
{
  "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.

JSON
{
  "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 #

JSON
{
  "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.