Publix

Location profiles, business contacts, menus, categories, and products, addressed by listing slug.

API reference

POST /graphql

Reads a listing snapshot by slug.

PropertyValue
Base URLhttps://publix-api.mateality.com
Content-Typeapplication/json
Root fieldlisting(slug: $slug)
Public authNone
Private authX-Publix-Embed-Key or Authorization: Bearer

Request body

type PublixGraphQLRequest = {
  query: string;
  variables?: {
    slug?: string;
  };
};

Pass the slug in variables.slug. Nested fields — menus, categories, products, business, location — are selected inside the listing field.


GET /health

Health probe. Returns 200 when the service is running.

{ "status": "ok" }

Data model

Listing

Root object returned by listing(slug: $slug).

FieldTypeDescription
idstringStable listing identifier
slugstringURL-safe public lookup key
visibility"disabled" | "private" | "public"Consumer access mode
discoveryEnabledbooleanWhether directories should surface this listing
indexingEnabledbooleanWhether crawlers should index this listing
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last-modified timestamp
locationLocationLocation profile
businessBusinessBusiness profile
menusMenu[]Published menus
productsProduct[]Top-level products not attached to a menu

Location

FieldTypeDescription
displayNamestring | nullHuman-readable location name
brandColorstring | nullHex color string (e.g. "#2563eb")
citystring | nullCity name
countrystring | nullISO 3166-1 alpha-2 country code
addressstring | nullFull street address
latstring | nullLatitude as a decimal string
lonstring | nullLongitude as a decimal string
currencyCodestring | nullISO 4217 currency code
locationTypestring | nullOperational type (e.g. "restaurant", "retail")
locationCategorystring | nullIndustry or cuisine category
onlineOrdersActivebooleanWhether online ordering is currently active
logoMedia | nullBrand logo

Coordinates (lat, lon) are strings to preserve source precision. Convert with parseFloat only after checking for null.


Business

FieldTypeDescription
displayNamestring | nullLegal or trading name
contactEmailstring | nullPublic contact email
phonestring | nullPublic phone number
websiteUrlstring | nullBusiness website URL

FieldTypeDescription
idstringStable menu identifier
namestringMenu name
descriptionstring | nullOptional description
tagsstring[]Metadata tags
visibilitystringMenu visibility
coverMedia | nullCover image
categoriesCategory[]Ordered categories

Category

FieldTypeDescription
idstringStable category identifier
namestringCategory name
descriptionstring | nullOptional description
tagsstring[]Metadata tags
coverMedia | nullCover image
productsProduct[]Ordered products

Product

FieldTypeDescription
idstringStable product identifier
namestringProduct name
descriptionstring | nullFull description
pricingPricingPrice details
mediaProductMediaProduct images
quantityQuantityServing size / quantity info
availabilityAvailabilityCurrent availability
ingredientsTextstring | nullFree-text ingredients
allergensstring[]Allergen identifiers
allergenDisclosuresAllergenDisclosure[]Structured allergen disclosures
nutritionSummarystring | nullShort nutrition description
nutritionReferenceBasis"per_100g" | "per_100ml" | nullBasis for nutrition values
showNutritionPerServingbooleanWhether to display per-serving values
servingDescriptionstring | nullServing size description
nutritionValuesNutritionValue[]Structured nutrition data
mentionsMention[]Label statements and badges

Pricing

FieldTypeDescription
pricestringDecimal price string (e.g. "12.50")
currencyCodestring | nullISO 4217 currency code
unitOfMeasurestring | nullUnit (e.g. "per kg", "per item")

Prices are strings to preserve decimal precision. Use a decimal library for totals.

ProductMedia

FieldTypeDescription
iconUrlstring | nullThumbnail image URL

Quantity

FieldTypeDescription
displayLabelstring | nullHuman-readable label (e.g. "250 ml", "serves 2")
netQuantityValuenumber | nullNumeric net quantity
netQuantityUnitstring | nullUnit for the numeric value

Availability

FieldTypeDescription
status"published" | "draft"Publication status
availablebooleantrue when the product can be ordered

AllergenDisclosure

FieldTypeDescription
allergenCodestringAllergen identifier
disclosureType"contains" | "may_contain"Disclosure level

NutritionValue

FieldTypeDescription
nutrientCodestringNutrient identifier
amountPerReferencenumberAmount per reference basis
unitstringUnit (e.g. "g", "kcal", "mg")

Mention

FieldTypeDescription
type"warning" | "regulatory" | "certification" | "custom"Statement category
labelstring | nullShort badge label (e.g. "Vegan", "Organic")
textstringFull statement text

Media

Shared image type used by location.logo, menu.cover, and category.cover.

FieldTypeDescription
urlstring | nullAbsolute URL — use as-is
altstring | nullAccessible alt text

TypeScript types

export type Media = { url: string | null; alt: string | null } | null;

export type Pricing = {
  price: string;
  currencyCode: string | null;
  unitOfMeasure: string | null;
};

export type Availability = {
  status: "published" | "draft";
  available: boolean;
};

export type AllergenDisclosure = {
  allergenCode: string;
  disclosureType: "contains" | "may_contain";
};

export type NutritionValue = {
  nutrientCode: string;
  amountPerReference: number;
  unit: string;
};

export type Mention = {
  type: "warning" | "regulatory" | "certification" | "custom";
  label: string | null;
  text: string;
};

export type Product = {
  id: string;
  name: string;
  description: string | null;
  pricing: Pricing;
  media: { iconUrl: string | null };
  quantity: {
    displayLabel: string | null;
    netQuantityValue: number | null;
    netQuantityUnit: string | null;
  };
  availability: Availability;
  ingredientsText: string | null;
  allergens: string[];
  allergenDisclosures: AllergenDisclosure[];
  nutritionSummary: string | null;
  nutritionReferenceBasis: "per_100g" | "per_100ml" | null;
  showNutritionPerServing: boolean;
  servingDescription: string | null;
  nutritionValues: NutritionValue[];
  mentions: Mention[];
};

export type Category = {
  id: string;
  name: string;
  description: string | null;
  tags: string[];
  cover: Media;
  products: Product[];
};

export type Menu = {
  id: string;
  name: string;
  description: string | null;
  tags: string[];
  visibility: string;
  cover: Media;
  categories: Category[];
};

export type PublixListing = {
  id: string;
  slug: string;
  visibility: "disabled" | "private" | "public";
  discoveryEnabled: boolean;
  indexingEnabled: boolean;
  createdAt: string;
  updatedAt: string;
  location: {
    displayName: string | null;
    brandColor: string | null;
    city: string | null;
    country: string | null;
    address: string | null;
    lat: string | null;
    lon: string | null;
    currencyCode: string | null;
    locationType: string | null;
    locationCategory: string | null;
    onlineOrdersActive: boolean;
    logo: Media;
  };
  business: {
    displayName: string | null;
    contactEmail: string | null;
    phone: string | null;
    websiteUrl: string | null;
  };
  menus: Menu[];
  products: Product[];
};

Versioning

New fields may be added to any object without a version bump. Existing fields are stable within v1. Code defensively for nullable fields.