Angebote APIOffers API
Erstelle und verwalte digitale Angebote, die Alternative zu Papier-Prospekten. Angebote erscheinen in der BEEP!-App auf der Discover-Seite der jeweiligen Filiale(n). Ein Angebot kann gleichzeitig für mehrere Filialen einer Kette ausgerollt werden.
Create and manage digital offers, the alternative to paper flyers. Offers appear in the BEEP! app on the discover page of the relevant store(s). A single offer can be rolled out simultaneously to multiple branches of a chain.
validTo-Datum in der Vergangenheit liegt, werden automatisch aus der Consumer-App ausgeblendet. Sie bleiben über getManagerOffers sichtbar (Status-Filter "expired"). Zum vollständigen Entfernen nutze deleteOffer.Offers whose validTo date is in the past are automatically hidden from the consumer app. They remain visible via getManagerOffers (status filter "expired"). To remove completely, use deleteOffer.Multi-Filial-AngeboteMulti-Store Offers
Handelsketten können ein Angebot in einem einzigen API-Call für alle gewünschten Filialen gleichzeitig ausrollen. Das Backend erstellt dabei ein eigenes Firestore-Dokument pro Filiale, jedes mit den lokalen Geodaten, damit Kunden in der Nähe der jeweiligen Filiale das Angebot sehen. Alle Filial-Kopien sind über ein gemeinsames groupId-Feld verknüpft.
Retail chains can roll out an offer to all desired branches in a single API call. The backend creates a dedicated Firestore document per store, each with local geo-data so that customers near that branch see the offer. All branch copies are linked via a shared groupId field.
storeIds: ["store_a", "store_b", "store_c"]groupId.One Firestore document per branch with local coordinates. All copies share a common groupId.updateOffer und deleteOffer wirken auf alle Filial-Kopien der Angebotsgruppe.updateOffer and deleteOffer apply to all branch copies of the offer group.POST /api/v1/createOffer
Erstellt ein neues Angebot für eine oder mehrere Filialen. Das Angebot wird nach Erstellung sofort in der App sichtbar.
Creates a new offer for one or more stores. The offer becomes immediately visible in the app after creation.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
storeIds | string[] | Ja | Liste der Store-IDs. Für Multi-Filial-Angebote mehrere IDs übergeben.List of store IDs. Pass multiple IDs for multi-branch offers. |
title | string | Ja | Titel des Angebots (min. 3 Zeichen)Offer title (min. 3 characters) |
description | string | Nein | Beschreibung (wird automatisch generiert wenn leer)Description (auto-generated if empty) |
validFrom | string | Ja | ISO 8601 StartdatumISO 8601 start date |
validTo | string | Ja | ISO 8601 EnddatumISO 8601 end date |
merchantColor | string | Nein | Primärfarbe als Hex ohne #, z.B. "D40000". Default: "FF6600"Primary colour as hex without #, e.g. "D40000". Default: "FF6600" |
tags | string[] | Nein | Schlagwörter für die Suche, z.B. ["Bio", "Frische"]Search keywords, e.g. ["Organic", "Fresh"] |
products | object[] | Ja | Liste der Angebotsprodukte (min. 1). Siehe Produkt-Schema unten.List of offer products (min. 1). See product schema below. |
Produkt-Schema (products[])Product schema (products[])
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
name | string | Ja | ProduktnameProduct name |
price | number | Ja | Aktueller Aktionspreis in EURCurrent discounted price in EUR |
oldPrice | number | Nein | Ursprünglicher Preis (für Durchstreichung in App)Original price (displayed as strikethrough in app) |
discountPercentage | number | Nein | Rabatt in Prozent (0–100). Wenn angegeben, wird price aus oldPrice berechnet.Discount in percent (0–100). If provided, price is calculated from oldPrice. |
category | string | Nein | Produktkategorie, z.B. "Getränke"Product category, e.g. "Beverages" |
manufacturer | string | Nein | Marke/HerstellerBrand / manufacturer |
unit | string | Nein | Mengeneinheit, z.B. "1,5L Flasche"Unit description, e.g. "1.5L bottle" |
description | string | Nein | Kurzbeschreibung des ProduktsShort product description |
Response (200 OK)
POST /api/v1/updateOffer
Aktualisiert ein bestehendes Angebot. Nur übergebene Felder werden geändert (Partial Update). Bei Multi-Store-Angeboten werden gemeinsame Felder (Titel, Produkte, Datum, Farbe, Tags) automatisch auf alle verknüpften Filial-Dokumente propagiert. Über das optionale Feld storeIds kann die Filial-Zuordnung nachträglich angepasst werden: neue Filialen werden automatisch angelegt, entfernte Filialen deaktiviert.
Updates an existing offer. Only passed fields are changed (partial update). For multi-store offers, shared fields (title, products, dates, colour, tags) are automatically propagated to all linked branch documents. The optional storeIds field allows updating the store assignment: new stores are automatically created, removed stores are deactivated.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
offerId | string | Ja | ID eines der Angebots-Dokumente (eines aus offerIds reicht)ID of any one offer document (any ID from offerIds works) |
title | string | Nein | Neuer Titel |
products | object[] | Nein | Neue Produktliste (ersetzt bisherige vollständig)New product list (replaces existing completely) |
storeIds | string[] | Nein | Neue vollständige Filial-Liste. Das Backend erstellt Dokumente für hinzugefügte Filialen und deaktiviert Dokumente für entfernte Filialen. Alle Änderungen propagieren auf bestehende Geschwister-Dokumente.New complete store list. The backend creates documents for added stores and deactivates documents for removed stores. All changes propagate to existing sibling documents. |
validFrom | string | Nein | Neues Startdatum (ISO 8601)New start date (ISO 8601) |
validTo | string | Nein | Neues Enddatum (ISO 8601)New end date (ISO 8601) |
merchantColor | string | Nein | Neue Primärfarbe (Hex ohne #)New primary colour (hex without #) |
tags | string[] | Nein | Neue SchlagwörterNew tags |
Response (200 OK)
POST /api/v1/deleteOffer
Löscht ein Angebot. Das Angebot verschwindet sofort aus der App. Bei Multi-Store-Angeboten werden alle verknüpften Filial-Dokumente gemeinsam gelöscht.
Deletes an offer. The offer disappears immediately from the app. For multi-store offers, all linked branch documents are deleted together.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
offerId | string | Ja | ID eines der Angebots-DokumenteID of any one offer document |
POST /api/v1/getManagerOffers
active
scheduled
expired
Listet alle Angebote des angemeldeten Managers auf (aktiv, abgelaufen, geplant). Multi-Store-Angebote werden dedupliziert zurückgegeben, jede Angebotsgruppe erscheint einmal mit ihrer groupId.
Lists all offers for the authenticated manager (active, expired, scheduled). Multi-store offers are returned deduplicated, each offer group appears once with its groupId.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
status | string | Nein | "active", "expired", "scheduled" (Default: alle) |
POST /api/v1/cloneOffer
Dupliziert ein bestehendes Angebot für andere Filialen. Nützlich um bewährte Angebote auf neue Filialen einer Kette auszurollen oder saisonale Angebote als Vorlage zu nutzen.
Duplicates an existing offer for other stores. Useful for rolling out proven offers to new chain branches or using seasonal offers as templates.
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
offerId | string | Ja | ID des zu duplizierenden AngebotsID of the offer to duplicate |
targetStoreIds | string[] | Ja | Store-IDs für die KopienStore IDs for the copies |
priceAdjustments | object | Nein | Optionale Preisanpassungen pro Filiale. Schlüssel = Store-ID, Wert = { type: "percentage"|"fixed", value: number }Optional price adjustments per store. Key = store ID, value = { type: "percentage"|"fixed", value: number } |
Response (200 OK)
"_sandbox": true und Mock-Daten.In sandbox mode, offers are not actually created. The response always contains "_sandbox": true and mock data.