PriceZag API — Preisdaten mit deinen Systemen verbinden
Mit der JSON-API von PriceZag kannst du Preise und Bestände der Wettbewerber abrufen, Produkte und Preisregeln verwalten, Berichte herunterladen und Abläufe automatisieren.
Schnelles curl-Beispiel
MYAPIKEY durch deinen API-Schlüssel (siehe API-Schlüssel).Testprodukt erstellen:
curl -vX POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"productCreate","code":"000-SOME-TEST-PRODUCT","name":"Some Test Product created via PriceZag API","price":12.34,"currency":"USD"}]}'
(beim zweiten Ausführen erscheint ein Fehler, da das Produkt bereits vorhanden ist)Jetzt kannst du dieses Produkt abrufen:
curl -X POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"productGet","code":"000-SOME-TEST-PRODUCT"}]}' | python -mjson.tool
(entferne | python -mjson.tool falls du dieses Werkzeug zum Formatieren der JSON-Antwort im Terminal nicht installiert hast)Überblick
Was du mit der PriceZag API machen kannst
Mit der JSON-API von PriceZag können deine Skripte und Systeme direkt mit den von uns überwachten Preisen und Beständen arbeiten. Du kannst Produktdaten abrufen, Produkte und Kategorien verwalten, Beträge anhand von Repricing-Regeln berechnen, Benachrichtigungen konfigurieren und benutzerdefinierte Tabellen herunterladen. Die API funktioniert mit jeder E-Commerce-Plattform und jeder Programmiersprache, die HTTPS-Anfragen senden und JSON verarbeiten kann.
Du kannst auch deinen bevorzugten KI-Assistenten bitten, die Skripte für dich zu schreiben. Gib ihm die URL dieser Dokumentation (https://pricezag.com/integrations/api), erkläre, was du automatisieren möchtest, und nenne deine Programmiersprache oder E-Commerce-Plattform. Halte deinen API-Schlüssel geheim und teile ihn nicht in einem KI-Chat.
PriceZag übernimmt die Überwachung innerhalb unserer Plattform; die API ist daher optional. Sie ist hilfreich, wenn du eigene Systeme mit diesen Daten verbinden möchtest. Shopify und WooCommerce bieten außerdem direkte Integrationen.
API-Schlüssel und Berechtigungen
Öffne in deinem PriceZag-Konto Automation > API. Klicke auf Reveal the current API key, um deinen aktuellen Schlüssel anzuzeigen, oder auf Change the API key, um ihn zu ersetzen. Für beide Vorgänge musst du dein Kontopasswort eingeben. Dein Benutzer benötigt die entsprechende Berechtigung, um API-Schlüssel anzuzeigen oder zu erzeugen. Andernfalls wende dich an einen Kontoadministrator.
Halte deinen API-Schlüssel geheim. Damit können weitreichende Änderungen an Kontodaten bis hin zum Löschen vorgenommen werden. Speichere den Schlüssel nicht in öffentlichen Repositories, im Browser-Code oder in KI-Chats. Wenn dir jemand bei einer Integration hilft, richte einen PriceZag-Benutzer mit passenden Berechtigungen ein und erneuere den API-Schlüssel bei Bedarf.
Der API-Zugriff hängt von deiner Mitgliedschaft ab. Bei vollem Zugriff können deine Skripte mit allen Produkten arbeiten. Ohne vollen Zugriff erreicht die API nur die ersten zehn Produkte, alphanumerisch nach Referenzcode sortiert. Wenn du beispielsweise 1.000 Produkte mit Codes von SKU0001 bis SKU1000 hast, kann die API die Produkte von SKU0001 bis SKU0010 abrufen. In der anfänglichen Phase mit allen Funktionen des Free-Forever-Tarifs ist voller API-Zugriff enthalten. Du kannst ihn auch als Option deiner Mitgliedschaft aktivieren.
API-Aktivitätsprotokoll und letzte Anfrage
Die Seite Automation > API in deinem Konto zeigt den Zeitpunkt der letzten API-Anfrage und die Schaltfläche API Activity Log. Prüfe diese Angaben, wenn ein Skript nicht funktioniert: So siehst du, ob Anfragen PriceZag erreicht haben, und kannst Fehler oder unerwartete Änderungen untersuchen.
Änderungen über die API erscheinen außerdem im History of Edits an verschiedenen Stellen des Kontos unter dem Benutzernamen API. Im Änderungsverlauf eines Produkts steht dann beispielsweise Price edited by API anstelle von Price edited by JOHN. PriceZag unterstützt mehrere Benutzer pro Konto. So kannst du automatische Änderungen von den Änderungen einzelner Teammitglieder unterscheiden.
Anfrage-URL und Methoden
Alle API-Anfragen verwenden dieselbe HTTPS-URL. Sende POST an diese Adresse und ersetze MYAPIKEY durch deinen Schlüssel:
https://pricezag.com/api/v3/MYAPIKEY
Was du mit der API tun möchtest (die "actions") und die Parameter stehen im JSON-Anfragetext und nicht in der URL.
Sende ein JSON-Objekt mit einer oder mehreren Aktionen im POST-Body. Die URL bleibt gleich, egal ob du ein Produkt abrufst, Preise aktualisierst oder eine Tabelle herunterlädst.
POST nicht möglich?
Als letzte Möglichkeit kannst du eine GET-Anfrage senden und den JSON-Inhalt base64-kodiert im URL-Parameter ?data= übergeben. URLs haben Längenbeschränkungen. POST wird daher dringend empfohlen.
So funktionieren Aktionen
Die API und die Benutzeroberfläche (UI) greifen auf dieselben Funktionen im Backend zu. Daher lässt sich nahezu jede Aktion der Oberfläche auch per API ausführen.
Wenn du eine API-Anfrage sendest, enthält dein JSON ein Array aller auszuführenden Aktionen, von 1 bis höchstens 1.000 pro Anfrage. Du kannst zum Beispiel drei Produkte umbenennen und eine neue Kategorie in einer einzigen Anfrage mit vier Aktionen erstellen. Ebenso lassen sich 1.000 Produkte mit 1.000 "productGet"-Aktionen auf einmal abrufen.
Aktionen werden in der Reihenfolge des Arrays ausgeführt. Wenn du eine Repricing-Regel erstellst und danach Produkte zuweist, müssen die Aktionen in dieser Reihenfolge stehen, damit die Regel vor der Produktänderung existiert.
Weiter unten findest du die Liste aller verfügbaren Aktionen.
Dein JSON-Anfrageobjekt
Für Skripte und KI-generierten Code: Die Referenzbeispiele enthalten // Kommentare und ... Platzhalter zur Erklärung der Felder. Das ist kein gültiges JSON, das du unverändert senden kannst. Entferne Kommentare und Platzhalter vor dem Senden. Die beiden curl -Beispiele oben enthalten dagegen gültige JSON-Daten.
{
"stopOnFailure" : 1, // (optional) Normalerweise wird die nachste Aktion auch nach einem Fehler ausgefuhrt. Mit 1 wird abgebrochen.
// Array mit allen Aktionen:
"actions" : [
// Aktion 1:
{
"a" : "someActionName", // Der Aktionsname steht immer in der Variable "a" jedes Objekts.
"xx" : "some parameter this action needs" // Alles ausser "a" sind die fur die jeweilige Aktion benotigten Parameter.
},
// Aktion 2:
{
"a" : "anotherActionName",
"abc" : "some parameter this action needs",
"xyz" : {"x":"some object this action needs", "y":5, "z":6}
},
// Aktion 3:
{
"a" : "aThirdAction",
"xyz" : ["some array this action needs", "..."]
}
]
}
Serverantwort und HTTP-Statuscodes
Ist die Anfrage gültig, erhältst du normalerweise ein JSON als Antwort, ausgenommen einige ausdrücklich gekennzeichnete Aktionen (etwa der Tabellen-Download). Du erkennst dies am Antwort-Header Content-Type: application/json.
Der HTTP-Antwortcode lautet:
► 200 wenn alle Aktionen erfolgreich waren (das neutrale Ergebnis ok=0 zählt als Erfolg)
► 406 wenn einige Aktionen erfolgreich waren und andere fehlgeschlagen sind.
► 422 wenn alle Aktionen fehlgeschlagen sind, jedoch nicht aus den nachfolgenden Gründen.
► 400 wenn das empfangene JSON-Objekt nicht dekodiert werden konnte.
► 403 wenn die Authentifizierung fehlschlägt (meist wegen eines falschen API-Schlüssels).
Wenn du es einfach halten willst, kannst du dich in deinen Skripten auf diese Antwortcodes verlassen. Ansonsten liefert das zurückgegebene JSON-Objekt weitere Informationen:
{
"ok" : 15, // Anzahl erfolgreich ausgefuhrter Aktionen (ok>0)
"errors" : 0, // Anzahl der Aktionen mit Fehler (ok<0)
"actionsCount" : 20, // Gesamtzahl der ursprunglich angefragten Aktionen (Lange des Arrays "actions")
// HINWEIS: Daraus folgt, dass 5 Aktionen ok=0 lieferten (kein Fehler, aber keine Anderung).
// Array aller angefragten Aktionen (in derselben Reihenfolge):
"actions" : [
...
// Antwortobjekt fur jede Aktion:
{
"a" : "someActionName",
"ok" : 4, // Ergebnis: >0 = Erfolg, 0 = keine Anderung, <0 = Fehler
// 0 zum Beispiel, wenn du einen Produktpreis auf seinen bisherigen Wert setzt.
// -1, wenn das Produkt nicht existiert.
// >0 hangt von der Aktion ab. Oft ist es die Anzahl geanderter Felder oder Elemente.
"error" : "...", // Fehlermeldung, wenn ok < 0
// Unsere Fehlermeldungen sind sehr detailliert. Protokolliere sie,
// denn sie enthalten alle Informationen zur Fehleranalyse.
... // Weitere aktionsspezifische Ruckgabedaten
},
...
]
}
Beispiele?
Anfragelimits und Zeitplanung
Damit legitime Anfragen nicht blockiert werden:
► Verwende niemals einen falschen API-Schlüssel. Die Firewall toleriert nur wenige Fehlversuche (ebenso wie bei falschen Website-Passwörtern).
► Fasse viele Aktionen in einer einzigen Anfrage und einem JSON-Objekt zusammen (maximal 1.000). Zum Erstellen von 1.000 Produkten sende eine Anfrage, nicht 1.000.
► Wenn du viele Anfragen stellen musst, warte jeweils 500 ms dazwischen und verwende dieselbe HTTPS-Verbindung erneut. Für jede Anfrage eine neue Verbindung zu öffnen, ist ein häufiger Fehler. Viele Anfragen sind meist nur bei Hunderttausenden von Produktänderungen sinnvoll, mit 1.000 Aktionen pro Anfrage.
Es gibt kein festes Anfrage-Ratenlimit. Unsere Firewall entscheidet anhand Dutzender Parameter. Hier hilft gesunder Menschenverstand.
Geplante Anfragen:
Wenn du Anfragen regelmäßig planst, füge eine zufällige Wartezeit hinzu, damit sie nicht genau zur vollen Minute erfolgen. Viele Kunden senden bei Sekunde 0. So können Anfragen schneller verarbeitet werden und laufen seltener in einen Timeout.
Alle verfügbaren API-Aktionen
Zu jeder Aktion findest du Parameter sowie Anfrage- und Antwortbeispiele. Über die linke Navigation gelangst du direkt zur jeweiligen Aktion.
Produkte
| Aktion | Zweck |
|---|---|
| productCreate | Neues Produkt erstellen |
| productEdit | Vorhandenes Produkt bearbeiten |
| productCompetitors | Wettbewerber-URLs eines Produkts bearbeiten (ohne alle überschreiben zu müssen) |
| productCategories | Kategorien eines oder mehrerer Produkte bearbeiten (ohne alle überschreiben zu müssen) |
| productRepricing | Viele Produkte einer Repricing-Regel zuweisen |
| productDelete | Ein oder mehrere Produkte löschen |
| productGet | Produkt abrufen (einschließlich Wettbewerberdaten) |
| productGetAll | Alle Produkte abrufen (einschließlich Wettbewerberdaten) |
Kategorien
| Aktion | Zweck |
|---|---|
| categoryCreate | Neue Kategorie erstellen |
| categoryEdit | Vorhandene Kategorie bearbeiten |
| categoryDelete | Eine oder mehrere Kategorien löschen |
| categoryCopy | Produkte zwischen Kategorien kopieren oder verschieben |
| categoryGet | Kategorie abrufen |
| categoryGetAll | Alle Kategorien abrufen |
Benachrichtigungen
| Aktion | Zweck |
|---|---|
| alertRecipientCreate | Neuen Benachrichtigungsempfänger erstellen |
| alertRecipientEdit | Empfänger und/oder dessen Benachrichtigungsregeln bearbeiten |
| alertRecipientDelete | Benachrichtigungsempfänger löschen |
| alertRuleEdit | Vorhandene Benachrichtigungsregel bearbeiten |
| alertRuleCreate ? | Diese Aktion existiert nicht. Verwende stattdessen alertRecipientEdit mit einem "rulesAdd"-Array. |
| alertRuleDelete ? | Diese Aktion existiert nicht. Verwende stattdessen alertRecipientEdit mit einem "rulesRemove"-Array. |
| alertGetAll | Alle Empfänger und Benachrichtigungsregeln abrufen |
Repricing-Regeln
| Aktion | Zweck |
|---|---|
| repricingCreate | Repricing-Regel erstellen |
| repricingEdit | Vorhandene Repricing-Regel bearbeiten |
| repricingDelete | Repricing-Regel löschen |
| repricingGetAll | Alle Repricing-Regeln abrufen |
Tabellen
| Aktion | Zweck |
|---|---|
| spreadsheetDownload | Tabelle herunterladen |
| spreadsheetPresetEdit | Tabellen-Voreinstellung umbenennen oder löschen |
| spreadsheetAutoCreate | Automatischen Tabellenexport erstellen |
| spreadsheetAutoEdit | Automatischen Tabellenexport bearbeiten |
Wettbewerber und mehr
| Aktion | Zweck |
|---|---|
| competitorDeleteAll | Wettbewerber aus allen Produkten oder Kategorien entfernen |
| mathEdit | Preisberechnungen für eine Wettbewerber-Domain festlegen oder bearbeiten |
Produkte
productCreate - Neues Produkt erstellen
{ "actions" : [
...
{
"a" : "productCreate",
"code" : "UNIQUE-REF-CODE", // 1 bis 80 ([a-z\d][a-z\d_-]{0,78}[a-z\d]); ohne Gross-/Kleinschreibung (wird grossgeschrieben)
"name" : "The Product Name", // 1 bis 200
"price" : 1234.90, // Achtung bei Komma und Punkt. Kein Tausendertrennzeichen; Dezimalpunkt ist ein Punkt.
"currency" : "USD",
"cost" : 1234.90, // (optional)
"costCurrency" : "USD", // erforderlich, falls Kosten angegeben sind
"repricingRule" : "The Rule Name", // (optional) Zugewiesene Repricing-Regel (leer = deaktiviert, nicht vorhanden = Fehler)
"myWebsite" : "https://...", // (optional) URL oder shopify:productId:variantId oder woocommerce:productId(:variationId)
"competitors" : ["https://...", "https://..."], // (optional)
"categories" : ["The Category 1", "The Category 2"], // (optional) Produktkategorien (fehlende Kategorien werden erstellt)
"comments" : "Some comments\nAnd another line", // (optional) maximal 1000 UTF-8-Zeichen
"custom_someFieldName1" : "Value of custom field", // (optional)
"custom_someFieldName2" : "Value of other\nCustom\tField", // (optional)
// Benutzerdefinierte Felder sind fur deinen internen Gebrauch. Sie lassen sich an vielen Stellen nutzen, etwa als Spalten beim Tabellenexport.
// Bis zu 20 benutzerdefinierte Felder pro Produkt. Name maximal 40 Buchstaben/Ziffern/Unterstriche (Gross-/Kleinschreibung beachten), ohne "custom_"-Prafix (insgesamt 47).
// Wert maximal 500 Bytes (oft Zeichen). Du kannst eine Zahl setzen (custom_varname:123),
// aber wir geben immer Strings zuruck (custom_varname:"123"); konvertiere sie bei Bedarf.
// Zum Loschen eines benutzerdefinierten Feldes Wert "" setzen. Das gilt fur productEdit, nicht productCreate.
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "productCreate",
"ok" : 1,
"code" : "REF-CODE", // Endgultiger Code in der Datenbank (Sonderzeichen im Code konnen angepasst werden)
},
...
]
}
productEdit - Vorhandenes Produkt bearbeiten
{ "actions" : [
...
{
"a" : "productEdit",
"code" : "REF-CODE",
... // Verwendet die Parameter von productCreate, alle optional.
"newCode" : "REF-CODE-RENAMED", // (optional)
"competitors" : ["https://...", "https://..."], // Falls angegeben, werden ALLE vorhandenen Wettbewerber-URLs UBERSCHRIEBEN.
// Wenn du nur Wettbewerber zur bestehenden Liste hinzufügen oder daraus entfernen möchtest, verwende stattdessen die Aktion productCompetitors.
"categories" : ["The Category 1", "The Category 2"], // Falls angegeben, UBERSCHREIBT dies die bisherigen Kategorien. Alternativ productCategories oder categoryEdit verwenden.
"custom_someFieldName" : "New value or empty to delete that custom field",
// Maximal 20 benutzerdefinierte Felder pro Produkt. Um neue anzulegen, entferne alte mit "".
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "productEdit",
"ok" : 3, // Anzahl der Anderungen (z. B. mein Preis + 2 Wettbewerber-URLs = 3)
"code" : "REF-CODE", // Endgultiger neuer Code in der Datenbank (Sonderzeichen konnen angepasst werden)
},
...
]
}
productCompetitors - Wettbewerber-URLs eines Produkts bearbeiten
{ "actions" : [
...
{
"a" : "productCompetitors",
"code" : "REF-CODE",
"competitorsAdd" : ["https://...", "https://..."], // (optional) Diese Wettbewerber-URLs zu vorhandenen hinzufugen
"competitorsRemove" : ["https://...", "example.com/a0ff80...5f00", "example.net"], // (optional) Diese Wettbewerber entfernen. Jeder Eintrag kann sein:
// > Die URL (einschliesslich etwaiger Hashtag-Modifikatoren). Labels sind optional.
// > Die Wettbewerber-"ref" (von anderen Aktionen geliefert: Root-Domain und 32-stelliger md5-Hash)
// > Root-Domain oder voller Hostname; alle URLs dieser Domain werden aus dem Produkt entfernt.
// HINWEIS: "competitorsAdd" und "competitorsRemove" konnen auch Strings statt Arrays mit einem Element sein.
// Zuerst wird entfernt und dann hinzugefugt: Du kannst eine ganze Domain entfernen und eine URL davon hinzufugen.
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "productCompetitors",
"ok" : 3, // Anzahl geanderter Wettbewerber-URLs
"competitorsAdded" : 2, // Anzahl zum Produkt hinzugefugter Wettbewerber-URLs
"competitorsRemoved" : 1, // Anzahl aus dem Produkt entfernter Wettbewerber-URLs
// FEHLER:
// > Vorhandene URL hinzufugen erzeugt KEINEN Fehler (ok = 0)
// > Nicht vorhandene URL oder "ref" entfernen erzeugt Fehler (ok = -1)
// > Alle URLs einer nicht vorhandenen Domain entfernen erzeugt KEINEN Fehler (ok = 0)
},
...
]
}
productCategories - Kategorien eines oder mehrerer Produkte bearbeiten
Dieselbe Funktion verwendet die Oberfläche, wenn du All Products öffnest, Produkte auswählst und auf Selected Products > Edit Categories klickst. Dort findest du weitere Erläuterungen.
Du kannst dir auch die Aktion categoryEdit ansehen und entscheiden, welche besser passt.
{ "actions" : [
...
{
"a" : "productCategories",
"code" : "REF-CODE", // Gross-/Kleinschreibung egal (String), ODER:
"code" : ["REF-CODE-1", "REF-CODE-2"], // kann auch ein Array mit mehreren Produkten sein (maximal 100.000)
"categoriesRemove" : ["The Category 1", "The Category 2"], // (optional) Zuerst aus diesen Kategorien entfernen.
"categoriesRemoveAll" : 1, // (optional) Zuerst aus allen Kategorien entfernen (wie productEdit).
"deleteEmptyCategories" : 1, // Damit wird jede Kategorie, die dadurch leer wird,
// nach dem Entfernen der Produkte geloscht.
"categoriesAdd" : ["The Category 1", "The Category 2"], // (optional) Danach zu diesen Kategorien hinzufugen (fehlende werden erstellt)
"categoriesAddClear" : 1, // (optional) Zuerst Zielkategorien leeren, denen Produkte zugewiesen werden
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "productCategories",
"ok" : 3, // Anzahl geanderter Produkte
},
...
]
}
productRepricing - Viele Produkte einer Repricing-Regel zuweisen
Dies bewirkt dasselbe wie die Aktion productEdit. Da eine Anfrage höchstens 1.000 Aktionen enthält, bräuchtest du mit productEdit für 50.000 Produkte ganze 50 Anfragen. Das wäre deutlich langsamer.
Wenn du nur wenige Produkte ändern möchtest, kannst du stattdessen productEdit verwenden.
{ "actions" : [
...
{
"a" : "productRepricing",
"repricingRule" : "The Rule Name", // ohne Gross-/Kleinschreibung; "" (vorhandener leerer String) bedeutet keine Regel (Repricing aus)
"products" : ["REF-CODE-1", "REF-CODE-2"], // ohne Gross-/Kleinschreibung (maximal 100.000)
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "productRepricing",
"ok" : 10, // Anzahl geanderter Produkte
// Wenn alle Produkte diese Regel bereits hatten, ist das Ergebnis ok=0.
},
...
]
}
productDelete - Ein oder mehrere Produkte löschen
Dieselbe Funktion verwendet die Oberfläche, wenn du All Products öffnest, Produkte auswählst und auf Selected Products > Delete.
{ "actions" : [
...
{
"a" : "productDelete",
"code" : "REF-CODE", // Gross-/Kleinschreibung egal (String), ODER:
"code" : ["REF-CODE-1", "REF-CODE-2"], // kann auch ein Array zum Loschen mehrerer Produkte sein (maximal 100.000)
"deleteEmptyCategories" : 1, // Damit wird jede Kategorie, die dadurch leer wird,
// so werden dadurch leer gewordene Kategorien ebenfalls geloscht
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "productDelete",
"ok" : 2, // Anzahl erfolgreich geloschter Produkte
},
...
]
}
productGet - Produkt abrufen
{ "actions" : [
...
{
"a" : "productGet",
"code" : "REF-CODE", // ohne Gross-/Kleinschreibung
"currency" : "EUR", // (optional) Betrage in diese Wahrung statt in die Produktwahrung umrechnen
"withStats" : 1, // (optional) Statistikobjekt zuruckgeben
"noCompetitors" : 1, // (optional) Wettbewerber-Array weglassen (kleinere Antwort)
"noComments" : 1, // (optional) Kommentare nicht zuruckgeben (...)
"withScreenshots" : 1, // (optional) URL des neuesten Screenshots jedes Wettbewerbers zuruckgeben
"sickMax" : 2, // (optional, Standard 1) 0-3; nur URLs bis Fehlerstufe N zuruckgeben
},
...
] }
Gibt alle Informationen zu einem Produkt zurück, einschließlich aktueller Wettbewerberpreise und -bestände.ANTWORT:
{
...
"actions" : [
...
{
"a" : "productGet",
"ok" : 1,
"code" : "REF-CODE",
"name" : "The Product Name",
"price" : 1234.90, // Dein eigener Preis, immer in Originalwahrung
"currency" : "USD", // Originalwahrung von "price"
"convCurrency" : "EUR", // Wahrung der umgerechneten Betrage ("currency" oder Produktwahrung)
"priceConv" : 1234.90, // Eigener Preis in "convCurrency", oder identisch mit "price"
"cost" : 1234.90,
"costCurrency" : "USD",
"costPriceConv" : 1234.90, // Eigene Kosten in die Wahrung von "price" umgerechnet
"costConv" : 1234.90, // Eigene Kosten in "convCurrency" umgerechnet
"margin" : 10.5, // Prozentsatz (kann negativ sein)
"repricingRule" : "The Rule Name", // Diese 3 Repricing-Variablen FEHLEN ohne Repricing.
"reprice" : 1234.90, // Aktueller Repricing-Betrag, berechnet aus repricingRule
"repriceCurrency" : "USD", // Wie "convCurrency", nur zur Klarstellung
"myWebsite" : "https://...",
"created" : 1234567890, // Epoch-Zeitpunkt der Produkterstellung
"createdBy" : "SOMEUSER", // Benutzername oder "API"
"edited" : 1234567890, // Epoch-Zeitpunkt der letzten Bearbeitung (falls vorhanden)
"editedBy" : "SOMEUSER", // Benutzername oder "API"
"comments" : "Some comments\nAnd another line",
"commentsLast" : 1234567890, // Epoch-Zeitpunkt der letzten Kommentaranderung (falls vorhanden)
"commentsLastBy" : "SOMEUSER", // Benutzername oder "API"
"categories" : ["The Category 1", "The Category 2"],
"stats" : {
// Nur Wettbewerber-URLs mit Fehlerstufe 0 oder 1 zahlen fur Statistiken, unabhangig von "sickMax".
// Alle Betrage sind in "convCurrency", also der angegebenen "currency" oder Originalwahrung des Produkts.
// WARNUNG: Wenn kein Betrag vorhanden ist (z. B. compIn* ohne lagernde Wettbewerber), ist der Wert 0.
"rank" : 1.23, // Dein Preisrang (1 = niemand ist gunstiger)
"rankIn" : 1.23, // Dein Rang unter lagernden Wettbewerbern
"compCount" : 3, // Anzahl Wettbewerber mit gultigem Preis
"compInCount" : 3, // Anzahl lagernder Wettbewerber ...
"compOutCount" : 3, // Anzahl nicht lagernder Wettbewerber ...
"compAvg" : 123.56, // Durchschnitt aller Wettbewerber
"compAvgVsMe" : 123.56, // Abstand (in convCurrency) zwischen deinem Preis und dem Durchschnitt (negativ = du bist gunstiger)
"compInAvg" : 123.56, // Durchschnitt der lagernden Wettbewerber
"compInAvgVsMe" : 123.56, // Wie "compAvgVsMe", aber nur lagernde Wettbewerber
"compLowest" : 123.56, // Gunstigster Wettbewerber
"compLowestVsMe" : 123.56, // Wie "compAvgVsMe", aber mit Minimum statt Durchschnitt
"compInLowest" : 123.56, // Gunstigster lagernder Wettbewerber
"compInLowestVsMe" : 123.56, // Wie "compInAvgVsMe", aber ...
"compHighest" : 123.56, // Teuerster Wettbewerber
"compHighestVsMe" : 123.56, // Wie "compAvgVsMe", aber ...
"compInHighest" : 123.56, // Teuerster lagernder Wettbewerber
"compInHighestVsMe" : 123.56, // Wie "compInAvgVsMe", aber ...
},
"competitors" : [
// Wettbewerber-Array (gunstigster zuerst), jeder als Objekt:
...
{
"url" : "https://...", // Einschliesslich etwaiger Hashtag-Modifikatoren
"ref" : "example.com/123abc...def",
// URL-Referenz (Root-Domain + 32-stelliger md5); so identifizieren wir URLs intern.
"domain" : "example.com", // Root-Domain dieses Wettbewerbers
"price" : 1234.90, // Zuletzt gefundener Betrag (nach eingestellten Berechnungen)
"currency" : "USD", // Auf der Website erkannte Wahrung
"priceConv" : 1234.90, // Preis in "convCurrency" umgerechnet
"stock" : "5", // Bestand (String). "A" = verfugbar, "2" = 2 Stuck, "0" = ausverkauft, "" = unbekannt.
"salesWk" : 123, // Geschatzte Verkaufe pro Woche (falls verfugbar; siehe Hilfe beim Produkt)
"screenshotURL" : "https://pricezag.com/.../screenshot.png",
// bei "withScreenshots" URL des letzten Screenshots (ohne Anmeldung uber diesen langen Link erreichbar)
"confidence" : 98,
// Konfidenz in Prozent fur den erkannten Preis (siehe (?) beim Produkt)
// Unter 70 % (anpassbar) markieren wir den Preis mit einem Fragezeichen als "unzuverlassig".
// Das ist unabhangig vom Fehlerstatus. Eine URL kann derzeit fehlschlagen, obwohl der letzte Preis richtig war,
// oder funktionieren, obwohl wir beim erkannten Preis unsicher sind.
"sick" : 0, // URL-Fehlerstufe von 0 bis 3
// 0: Letzter Abruf erfolgreich (Seite geladen und Preis gefunden)
// 1: Letzter Abruf fehlgeschlagen, kurz zuvor aber erfolgreich (normal)
// 2: Seit mehreren Tagen kein gultiger Preis
// 3: Seit mehreren Wochen kein gultiger Preis
// HINWEIS: "price" und "priceConv" nur bei URLs mit Fehlerstufe <=1. Stufen 2 und 3 haben keinen Preis.
},
...
],
"custom" : {
// Das sind deine benutzerdefinierten Felder. Fur Erklarungen offne
// ein Produkt in der Oberflache und klicke auf (?) neben CUSTOM FIELDS.
// Ohne benutzerdefinierte Felder fehlt das Objekt "custom".
"variable_1" : "value 1", // Werte sind immer Strings, auch wenn sie Zahlen enthalten.
"variable_2" : "value 2", // Leere Werte gibt es nicht; sie wurden die Variable loschen.
...
}
},
...
]
}
productGetAll - Alle Produkte abrufen
{ "actions" : [
...
{
"a" : "productGetAll",
"currency" : "EUR", // (optional) Betrage in diese Wahrung statt in die Wahrung jedes Produkts umrechnen
"withStats" : 1, // (optional) Statistikobjekt zuruckgeben
"noCompetitors" : 1, // (optional) Wettbewerber-Array weglassen (kleinere Antwort)
"noComments" : 1, // (optional) Kommentare nicht zuruckgeben (...)
"withScreenshots" : 1, // (optional) URL des neuesten Screenshots jedes Wettbewerbers zuruckgeben
"sickMax" : 2, // (optional, Standard 1) 0-3; nur URLs bis Fehlerstufe N zuruckgeben
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "productGetAll",
"ok" : 10, // Gesamtzahl der Produkte
"products" : [ // Produkt-Array (alphabetisch nach Referenzcode), jedes Produkt als Objekt:
...
{ ... }, // Produktobjekt wie in der Antwort der Aktion productGet (direkt oben)
...
],
},
...
]
}
Sieh dir auch die Aktion categoryGet an.Kategorien
categoryCreate - Neue Kategorie erstellen
Anders als andere Aktionen, die vorhandene oder neue Kategorien akzeptieren (z. B. productCreate), schlägt diese Aktion fehl, wenn die Kategorie bereits existiert.
{ "actions" : [
...
{
"a" : "categoryCreate",
"name" : "The New Category Name",
"name" : ["New Category 1", "New Category 2"], // kann auch ein Array sein
"products" : ["REF-CODE-1", "REF-CODE-2"], // (optional) Produkte beim Erstellen den Kategorien zuweisen
"comments" : "Some comments\nAnd another line", // (optional) maximal 1000 UTF-8-Zeichen
},
...
] }
categoryEdit - Vorhandene Kategorie bearbeiten
{ "actions" : [
...
{
"a" : "categoryEdit",
"name" : "The Category Name", // ohne Gross-/Kleinschreibung
"newName" : "The Category Renamed", // (optional)
"products" : ["REF-CODE-1", "REF-CODE-2"], // (optional) Produktliste uberschreiben
"productsAdd" : ["REF-CODE-1", "REF-CODE-2"], // (optional) Produkte zur Kategorie hinzufugen
"productsRemove" : ["REF-CODE-3", "REF-CODE-4"], // (optional) Produkte aus Kategorie entfernen (NICHT loschen)
"comments" : "To overwrite the comments.", // (optional) maximal 1000 UTF-8-Zeichen
},
...
] }
Damit gilt: "products", "productsAdd" und "productsRemove" bewirken dasselbe: Sie ändern die zugehörigen Produkte, allerdings auf unterschiedliche Weise. Um alle Produkte zu entfernen, verwende "products" : []ANTWORT:
{
...
"actions" : [
...
{
"a" : "categoryEdit",
"ok" : 5, // Anzahl der Anderungen
// (Umbenennen und Kommentaranderung zahlen je 1; ebenso jedes hinzugefugte/entfernte Produkt)
"name" : "The Category Name", // neuer Name nach Umbenennung, sonst alter Name
"productsCount" : 30, // Neue Produktanzahl der Kategorie (ob geandert oder nicht)
"productsAdded" : 2, // Anzahl zur Kategorie hinzugefugter Produkte
"productsRemoved" : 2, // Anzahl aus der Kategorie entfernter Produkte
},
...
]
}
categoryDelete - Eine oder mehrere Kategorien löschen
{ "actions" : [
...
{
"a" : "categoryDelete",
"name" : "The Category Name", // Gross-/Kleinschreibung egal (String), ODER:
"name" : ["Category 1", "Category 2"], // kann auch ein Array zum Loschen mehrerer Kategorien sein (maximal 1000)
"deleteProducts" : 1,
// Standardmassig wird die Kategorie geloscht; ihre Produkte bleiben bestehen,
// aber mit deleteProducts werden alle Produkte der Kategorie ohne Bestatigung geloscht,
// und deren Wettbewerber-URLs werden ebenfalls unwiderruflich geloscht!
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "categoryDelete",
"ok" : 2, // Anzahl geloschter Kategorien
"productsCount" : 123, // Anzahl der von diesen Kategorien betroffenen Produkte
"productsDeleted" : 123, // Anzahl aufgrund der Option "deleteProducts" geloschter Produkte
// HINWEIS: Ein Produkt in mehreren angegebenen Kategorien zahlt nur einmal
},
...
]
}
categoryCopy - Produkte zwischen Kategorien kopieren oder verschieben
Dabei werden keine Produkte gelöscht, sondern lediglich Kategorien zugeordnet oder entzogen.
Dieselbe Funktion verwendet die Oberfläche, wenn du Categories öffnest, Kategorien auswählst und auf Selected Categories > Copy & More klickst. Dort findest du weitere Erläuterungen.
{ "actions" : [
...
{
"a" : "categoryCopy",
"categoriesFrom" : ["Category 1", "Category 2"], // Produkte aus diesen Kategorien auswahlen (Quelle)
"removeMode" : "cat", // (optional) Zugehorige Produkte aus den angegebenen "categoriesFrom" entfernen
"removeMode" : "all", // (optional) Zugehorige Produkte aus ALLEN ihren Kategorien entfernen
// Ohne removeMode bleiben die Produkte in "categoriesFrom" und werden auch zu "categoriesTo" hinzugefugt (kopieren statt verschieben)
"deleteMode" : "cat", // (optional) Die angegebenen "categoriesFrom" nach dem Kopieren loschen
"deleteMode" : "all", // (optional) Alle Kategorien dieser Produkte loschen
// Ohne deleteMode bleiben die "categoriesFrom" bestehen, auch wenn removeMode die Produkte daraus entfernt.
"categoriesTo" : ["Another Category 1", "Another Category 2"],
// Alle passenden Produkte in diese Zielkategorien legen (fehlende werden erstellt)
"categoriesToClear" : 1, // (optional) Zuerst Zielkategorien leeren, denen Produkte zugewiesen werden
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "categoryCopy",
"ok" : 3, // Anzahl geanderter Kategorien (Quelle und Ziel)
// "ok" ist die Summe von categoriesModified + categoriesCreated + categoriesDeleted
"categoriesModified" : 2, // Anzahl geanderter bestehender Kategorien (Quelle und Ziel)
"categoriesCreated" : 1, // Anzahl neu erstellter Kategorien
"categoriesDeleted" : 0, // Anzahl aufgrund von "deleteMode" geloschter Kategorien
"productsCount" : 123, // Anzahl Produkte in den angegebenen "categoriesFrom"
// HINWEIS: Ein Produkt in mehreren "categoriesFrom" zahlt nur einmal
},
...
]
}
categoryGet - Kategorie abrufen
{ "actions" : [
...
{
"a" : "categoryGet",
"name" : "The Category Name", // ohne Gross-/Kleinschreibung
"currency" : "EUR", // (ERFORDERLICH bei withStats oder withProducts) Wahrung fur die Statistiken
"withStats" : 1, // auch Statistiken zuruckgeben (langsamer)
"withProducts" : 1, // auch Produkte dieser Kategorie zuruckgeben (kann sehr umfangreich sein)
"noCompetitors" : 1, // bei withProducts Wettbewerber-Array weglassen (weniger Daten)
"noComments" : 1, // bei withProducts Produktkommentare weglassen (Kategoriekommentare bleiben)
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "categoryGet",
"ok" : 1,
"name" : "The Category Name",
"created" : 1234567890, // Epoch-Zeitpunkt
"createdBy" : "SOMEUSER", // Benutzername oder "API"
"comments" : "Comments of this category",
"commentsLast" : 1234567890, // Epoch-Zeitpunkt der letzten Kommentaranderung (falls vorhanden)
"commentsLastBy" : "SOMEUSER", // Benutzername oder "API"
"productsCount" : 10, // Anzahl Produkte in dieser Kategorie
"stats" : {
// Diese Statistiken stehen auf der Kategorieseite und als Spalten in der Kategorienliste.
// Fur Details wahlen sie als Spalte in der Kategorienliste aus und klicke auf (?).
// Alle Betrage sind in der bei der Anfrage angegebenen "currency".
// WARNUNG: Wenn kein Betrag vorhanden ist (z. B. compIn* ohne lagernde Wettbewerber), ist der Wert 0.
"priceAvg" : 123.45, // Durchschnitt deines eigenen Preises
"costAvg" : 123.45, // Nur Produkte mit Kostenwert gehen in diesen Durchschnitt ein
"marginAvg" : 10.5, // Prozentsatz (kann negativ sein; nur Produkte mit Kostenwert)
"rankAvg" : 1.23, // Dein durchschnittlicher Preisrang (1 = niemand ist gunstiger)
"rankInAvg" : 1.23, // Dein durchschnittlicher Rang unter lagernden Wettbewerbern
"productsCountComp" : 9, // Anzahl Produkte mit Wettbewerbern
"productsCountCompIn" : 7, // Anzahl Produkte mit lagernden Wettbewerbern
"compAvg" : 123.56, // Durchschnitt aller Wettbewerber-Durchschnittswerte
"compAvgVsMe" : 123.56, // Durchschnittlicher Abstand (in currency) zwischen deinem Preis und den Wettbewerbern (negativ = du bist gunstiger)
"compInAvg" : 123.56, // Wie "compAvg", aber nur lagernde Wettbewerber
"compInAvgVsMe" : 123.56, // Wie "compAvgVsMe", aber nur lagernde Wettbewerber
"compLowest" : 123.56, // Wie "compAvg", aber Durchschnitt des jeweils gunstigsten Wettbewerbers
"compLowestVsMe" : 123.56, // Wie "compAvgVsMe", aber ...
"compInLowest" : 123.56, // Wie "compInAvg", aber ...
"compInLowestVsMe" : 123.56, // Wie "compInAvgVsMe", aber ...
"compHighest" : 123.56, // Wie "compAvg", aber Durchschnitt des jeweils teuersten Wettbewerbers
"compHighestVsMe" : 123.56, // Wie "compAvgVsMe", aber ...
"compInHighest" : 123.56, // Wie "compInAvg", aber ...
"compInHighestVsMe" : 123.56, // Wie "compInAvgVsMe", aber ...
},
"products" : [ // Produkt-Array (alphabetisch nach Referenzcode), jedes Produkt als Objekt:
...
{ ... }, // Produktobjekt wie in der Antwort der Aktion productGet
...
],
},
...
]
}
categoryGetAll - Alle Kategorien abrufen
{ "actions" : [
...
{
"a" : "categoryGetAll",
"withStats" : 1, // auch Statistiken zuruckgeben (langsamer)
"noComments" : 1, // Kommentare weglassen (weniger Daten)
"noProducts" : 1, // Produkt-Array weglassen (...)
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "categoryGetAll",
"ok" : 10, // Gesamtzahl Kategorien (Lange des Arrays "categories")
"categories" : [ // Kategorien-Array (alphabetisch), jede Kategorie als Objekt:
...
{
"name" : "The Category Name",
"created" : 1234567890, // Epoch-Zeitpunkt
"createdBy" : "SOMEUSER", // Benutzername oder "API"
"comments" : "Comments of this category",
"commentsLast" : 1234567890, // Epoch-Zeitpunkt der letzten Kommentaranderung (falls vorhanden)
"commentsLastBy" : "SOMEUSER", // Benutzername oder "API"
"productsCount" : 2, // Anzahl Produkte in dieser Kategorie
"products" : ["REF-CODE-1", "REF-CODE-2"], // Referenzcodes der Produkte (alphabetisch), ausser bei noProducts=1
"stats" : {
// Bei "withStats" dasselbe Statistikobjekt wie bei der Aktion categoryGet (direkt oben)
...
},
}
...
],
},
...
]
}
Benachrichtigungen
alertRecipientCreate - Neuen Benachrichtigungsempfänger erstellen
Klicke in deinem Konto auf die grünen Fragezeichen-Symbole, um Details zu den einzelnen Feldern zu erhalten.
{ "actions" : [
...
{
"a" : "alertRecipientCreate",
"email" : "john@example.net", // kann auch Telefonnummer fur SMS-Alarme sein; siehe UI-Hilfe
"name" : "john", // Einfacher Anzeigename (meist Vorname; ohne Gross-/Kleinschreibung)
"maxFrequency" : 1800, // (optional, Standard 7200) siehe UI-Hilfe
"simplify" : 0, // (optional, Standard 1) Vereinfachung aktivieren (siehe UI)
"sleepEnabled" : 1, // (optional) Ruhezeit aktivieren
"sleepFrom" : "18:30", // (nur wenn sleepEnabled) 24-Stunden-Format
"sleepTo" : "07:00", // (nur wenn sleepEnabled) 24-Stunden-Format
"timezone" : "America/Los_Angeles", // (nur wenn sleepEnabled) Linux-Verzeichnispfad /usr/share/zoneinfo
// Leerzeichen werden durch Unterstriche ersetzt.
// Suche deine Zeitzone im Formular [New Recipient] der UI, damit der Name genau stimmt.
"status" : "hold", // (optional) "hold" oder "disable". Andere Werte (wie "") sind aktiv.
"rules" : [...], // (optional) Anfängliche Alarmregeln (Array von Regelobjekten), wie "rulesAdd" in alertRecipientEdit weiter unten
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "alertRecipientCreate",
"ok" : 1,
},
...
]
}
alertRecipientEdit - Empfänger und/oder dessen Benachrichtigungsregeln bearbeiten
Klicke in deinem Konto auf die grünen Fragezeichen-Symbole, um Details zu den einzelnen Feldern zu erhalten.
Die Seite "email" legt fest, welcher Empfänger aktualisiert wird. Alle anderen Felder ändern seine Einstellungen.
{ "actions" : [
...
{
"a" : "alertRecipientEdit",
"email" : "john@example.net", // Aktuelle E-Mail-Adresse oder Telefonnummer (genau im Format, das die Aktion alertGetAll zurückgibt)
"newEmail" : "john2@example.net", // (optional) Neue E-Mail oder Telefonnummer; siehe UI-Hilfe
"name" : "john2", // (optional) Neuer Name
"maxFrequency" : 1800, // (optional) siehe UI-Hilfe
"simplify" : 1, // (optional) Vereinfachung aktivieren (siehe UI)
"sleepEnabled" : 1, // (optional) Ruhezeit aktivieren
"sleepFrom" : "18:30", // (nur wenn sleepEnabled) 24-Stunden-Format
"sleepTo" : "07:00", // (nur wenn sleepEnabled) 24-Stunden-Format
"timezone" : "America/Los_Angeles", // (nur wenn sleepEnabled) siehe Aktion alertRecipientCreate oben
"status" : "hold", // (optional) "hold" oder "disable". Jeder andere Wert (wie "") wird zu "active".
"rules" : [{ruleObject}, {ruleObject}], // (optional) Alle bisherigen Regeln uberschreiben (leeres Array entfernt alle)
// Kein "rules"-Array angeben, wenn vorhandene Regeln bleiben sollen
"rulesAdd" : [ // (optional) Diese Regeln zu den vorhandenen hinzufugen
...
{ // DAS IST DAS FORMAT EINES REGELOBJEKTS:
"name" : "me_cross_avg", // Gehe zu Alerts > [Rules] > [+ New Rule] und wahle eine Regel, um ihren API-Namen zu sehen
"disabled" : 1, // (optional) Eine deaktivierte Regel neu anzulegen ist wenig sinnvoll, aber die Aktion alertRuleEdit unten kann diesen Wert verwenden
"var_n" : 123.00, // Eine Variable "X" wird zu "var_x",
"var_c" : "USD", // ... gib daher an, was diese Regel benotigt,
"var_h" : 24, // ... manche Regeln haben keine Variablen.
"direction" : "both", // Oder "drop" bzw. "rise", falls die Regel eine Richtung hat
"categories" : ["The Category 1", "The Category 2"], // (optional) Leer oder weggelassen bedeutet ALLE PRODUKTE
"ignoreOos" : 1, // (optional) Nicht lagernde Wettbewerber ignorieren (siehe UI)
"urlInclude" : "", // (optional, ohne Gross-/Kleinschreibung)
"urlExclude" : "amazon", // (optional, ohne Gross-/Kleinschreibung)
// "ruleNumber" identifiziert jede Regel (z. B. zum Bearbeiten oder Loschen).
// Beim Abrufen der Regeln wird es angezeigt; du kannst es aber nicht selbst setzen.
}
...
],
"rulesRemove" : [1,4,7], // (optional) "ruleNumber" der zu entfernenden Regeln
// Diese "ruleNumber" erhältst du von der Aktion alertGetAll weiter unten.
// HINWEIS: Um alle Regeln zu entfernen, verwende "rules" = [].
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "alertRecipientEdit",
"ok" : 3, // Anzahl Anderungen (Variablen plus hinzugefugte/entfernte Regeln)
},
...
]
}
alertRecipientDelete - Benachrichtigungsempfänger löschen
{ "actions" : [
...
{
"a" : "alertRecipientDelete",
"email" : "john@example.net", // Aktuelle E-Mail-Adresse oder Telefonnummer (genau im Format, das die Aktion alertGetAll zurückgibt)
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "alertRecipientDelete",
"ok" : 1,
},
...
]
}
alertRuleEdit - Vorhandene Benachrichtigungsregel bearbeiten
Um eine Regel zu entfernen, verwende das Array "rulesRemove" der Aktion alertRecipientEdit . Um eine neue hinzuzufügen, verwende deren Array "rulesAdd".
{ "actions" : [
...
{
"a" : "alertRuleEdit",
"email" : "john@example.net", // E-Mail-Adresse oder Telefonnummer des Empfängers (genau im Format, das die Aktion alertGetAll zurückgibt)
"ruleNumber" : 1, // Referenznummer der zu bearbeitenden Regel, wie von der Aktion alertGetAll unten zurückgegeben.
"rule" : {
// Zu überschreibende Regelvariablen. Das FORMAT EINES REGELOBJEKTS findest du unter "rulesAdd" in alertRecipientEdit oben.
"disabled" : 1, // etwa eine Regel aktivieren oder deaktivieren
"var_n" : 5, // oder andere Variable wie N, je nach Regeltyp
...
},
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "alertRuleEdit",
"ok" : 1, // Anzahl geanderter Variablen
},
...
]
}
alertGetAll - Alle Empfänger und Benachrichtigungsregeln abrufen
{ "actions" : [
...
{
"a" : "alertGetAll",
// Diese Aktion benotigt keine Parameter
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "alertGetAll",
"ok" : 3, // Anzahl Empfanger (Lange des Arrays "recipients")
"recipients" : [ // Array aller Empfänger; jedes Element ist ein Objekt wie bei der Aktion alertRecipientCreate oben
...
{
"email" : "john@example.net",
"name" : "john",
"maxFrequency" : 1800,
"simplify" : 0,
"sleepEnabled" : 1,
"sleepFrom" : "18:30",
"sleepTo" : "07:00",
"timezone" : "America/Los_Angeles",
"status" : "active",
"rules" : [ // Array von Regeln; jedes Element ist ein Objekt wie bei der Aktion alertRecipientEdit oben beschrieben
...
{
"ruleNumber" : 4, // Referenznummer, mit der du diese Regel über die Aktion alertRuleEdit oben bearbeiten kannst
"name" : "me_cross_avg",
"disabled" : 0,
"var_n" : "123.00", // HINWEIS: Alle Variablen werden als Strings geliefert, auch Zahlen
"var_c" : "USD",
"var_h" : "24",
"direction" : "both",
"categories" : [], // leer bedeutet alle Produkte
"ignoreOos" : 0,
"urlInclude" : "",
"urlExclude" : "amazon",
}
...
],
}
...
],
},
...
]
}
Repricing-Regeln
repricingCreate - Repricing-Regel erstellen
Klicke in deinem Konto auf die grünen Fragezeichen-Symbole, um Details zu den einzelnen Feldern zu erhalten.
Wie weist du der Regel Produkte zu? Bearbeite die Produkte mit der Aktion productEdit oder productRepricing . Eine Regel enthält selbst keine Produkte. Jedes Produkt verweist auf die Regel, die es verwendet.
{ "actions" : [
...
{
"a" : "repricingCreate",
"name" : "The Rule Name", // maximal 50 Zeichen
"init" : { // Initialisierungsobjekt (erste Zeile "Set my price to")
"target" : "cheapest_n", // (siehe Liste unten)
"var_n" : 3, // nur wenn das Ziel die Variable N benotigt
"plusAmount" : -2, // positiv: daruber; negativ: darunter
"plusCurrency" : "%", // Wahrung (z. B. "USD") oder "%"
// Entspricht "Set my price 2% below average of 3 cheapest competitors"
// WARNUNG: Anders als die "never"-Objekte hat der Initialisierer keine "direction". Das Vorzeichen von "plusAmount" bestimmt oberhalb/unterhalb.
},
"never" : [ // (optional) "but never"-Objekte in Reihenfolge ausgefuhrt (maximal 10)
{
"target" : "cheapest_n_in", // (siehe Liste unten)
"var_n" : 1, // nur wenn das Ziel die Variable N benotigt
"direction" : "below", // oder "above"
"plusAmount" : -10, // positiv: plus; negativ: minus (auch bei 0 erforderlich)
"plusCurrency" : "USD", // Wahrung oder "%" (auch bei plusAmount=0 erforderlich)
// Entspricht "But never below the cheapest competitor in-stock minus 10.00 USD"
},
{
"target" : "cost",
"direction" : "below",
"plusAmount" : 5,
"plusCurrency" : "%",
// Entspricht "But never below my cost plus 5%"
}
],
"ignoreDomains" : "amazon ebay.com MyLabel1", // (optional) Zu ignorierende Domains/Labels (ohne Gross-/Kleinschreibung; siehe UI)
"charm" : "none|zeros|charm", // (optional, Standard "none") Charm Pricing ("", "none" oder weggelassen sind gleich)
"confidence" : 82, // (optional, Standard 70) minimale Konfidenz 0-99 % (siehe UI)
"disabled" : 1, // (optional)
},
...
] }
// ========== Verfugbare "target"-Strings: ==========
// "average" : Durchschnitt aller Wettbewerber
// "average_in" : Durchschnitt lagernder Wettbewerber
// "cheapest_n" : Durchschnitt der N gunstigsten Wettbewerber (oder der gunstigste bei N=1)
// "cheapest_n_in" : Durchschnitt der N gunstigsten lagernden Wettbewerber (oder ...)
// "highest_n" : Durchschnitt der N teuersten Wettbewerber (oder ...)
// "highest_n_in" : Durchschnitt der N teuersten lagernden Wettbewerber (oder ...)
// "cost" : Meine Kosten
// "me_avg_n" : Mein Durchschnittspreis der letzten N Stunden (begrenzt die Preisanderungsgeschwindigkeit)
// "domain:example.com" : Preis von example.com (niedrigster bei mehreren URLs)
// "domainIn:example.com" : Preis von example.com nur bei Lagerbestand (...)
ANTWORT:{
...
"actions" : [
...
{
"a" : "repricingCreate",
"ok" : 3, // Anzahl erfolgreich verarbeiteter und gespeicherter Objekte (z. B. init + never[0] + never[1] = 3)
"name" : "The Rule Name", // Endgultiger Name in der Datenbank (Sonderzeichen konnen angepasst werden)
},
...
]
}
repricingEdit - Vorhandene Repricing-Regel bearbeiten
Siehe repricingCreate oben, um die Variablen zu verstehen.
Ändert die Regel selbst, nicht die zugewiesenen Produkte. Um Produkte zuzuweisen, verwende productEdit oder productRepricing verwenden.
{ "actions" : [
...
{
"a" : "repricingEdit",
"name" : "The Rule Name", // ohne Gross-/Kleinschreibung
"newName" : "The Rule Renamed", // (optional) maximal 50 Zeichen
"init" : { // (optional) Falls angegeben, Variablen des Initialisierers uberschreiben (siehe repricingCreate)
"plusAmount" : 1, // z. B. nur "plusAmount" uberschreiben und andere Variablen behalten
// WARNUNG: Wenn das neue "target" eine N-Variable braucht, musst du "var_n" angeben
},
"never" : [...], // (optional) Du kannst das gesamte "never"-Array ersetzen; meist ist never_* besser
// "never":[] entfernt alle Bedingungen. Weglassen behalt sie.
"never_0" : { // (optional) Erstes "but never"-Objekt uberschreiben (Index 0)
"var_n" : 2, // z. B. nur "var_n" uberschreiben und andere Variablen behalten
},
"never_2" : {
"target" : "", // deaktiviert die dritte "but never"-Bedingung (Index 2)
// Andere Variablen sind unwichtig, wenn "target" auf "" gesetzt ist.
// "never_2":{} hat denselben Effekt
},
"never_6" : {...}, // Kann eine neue "but never"-Bedingung sein; benotigt alle Variablen wie repricingCreate
// "never_9" ist das Maximum; Array erlaubt bis zu 10 Elemente
"ignoreDomains" : "", // (optional) wie repricingCreate
"charm" : "zeros", // (optional) ...
"confidence" : 82, // (optional) ...
"disabled" : 1, // (optional) 0 zum Aktivieren einer deaktivierten Regel
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "repricingEdit",
"ok" : 3, // Anzahl Anderungen (z. B. Variable aus never_N, eine aus "init" und "charm")
"name" : "The Rule Name", // Endgultiger neuer Name in der Datenbank (Sonderzeichen konnen angepasst werden)
},
...
]
}
repricingDelete - Repricing-Regel löschen
{ "actions" : [
...
{
"a" : "repricingDelete",
"name" : "The Rule Name", // ohne Gross-/Kleinschreibung
"onlyIfUnused" : 1, // (optional) Zur Sicherheit Fehler auslosen, falls Produkte diese Regel verwenden
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "repricingDelete",
"ok" : 1,
"productsCount" : 10, // Anzahl Produkte, die diese Regel nutzten (jetzt ohne Regel)
},
...
]
}
repricingGetAll - Alle Repricing-Regeln abrufen
{ "actions" : [
...
{
"a" : "repricingGetAll",
// Diese Aktion benotigt keine weiteren Parameter
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "repricingGetAll",
"ok" : 10, // Gesamtzahl Regeln (Lange von "rules")
"rules" : [ // Repricing-Regel-Array (alphabetisch), jede Regel als Objekt:
...
{
"name" : "Some Repricing Rule",
"created" : 1234567890, // Epoch-Zeitpunkt der Regelerstellung
"createdBy" : "SOMEUSER", // Benutzername oder "API"
"edited" : 1234567890, // Letzte Bearbeitung (falls vorhanden, sonst Variable fehlt)
"editedBy" : "SOMEUSER", // Benutzer oder "API" (oder fehlend)
"disabled" : 1234567890, // Wenn Regel deaktiviert: Epoch-Zeitpunkt der letzten Deaktivierung; sonst fehlend.
"disabledBy" : "SOMEUSER", // Benutzer oder "API" (oder fehlend)
"productsCount" : 10, // Anzahl Produkte, die diese Regel derzeit verwenden
"ignoreDomains" : "amazon ebay.com MyLabel1", // ignorierte Wettbewerber-Domains/Labels (siehe UI)
"charm" : "charm", // Charm-Pricing-Modus (none|zeros|charm)
"confidence" : 82, // minimale Konfidenz 0-99 % (siehe UI)
"init" : { // Initialisierungsobjekt (erste Zeile "Set my price to")
"target" : "cheapest_n", // (siehe Liste unter repricingCreate)
"var_n" : 3, // wenn Ziel N-Variable benotigt, sonst fehlend
"plusAmount" : -2, // positiv: daruber; negativ: darunter
"plusCurrency" : "%", // Wahrung (z. B. "USD") oder "%"
// Entspricht "Set my price 2% below average of 3 cheapest competitors"
// WARNUNG: Anders als die "never"-Objekte hat der Initialisierer keine "direction". Das Vorzeichen von "plusAmount" bestimmt oberhalb/unterhalb.
},
"never" : [ // "but never"-Objekte in Reihenfolge ausgefuhrt
{
"target" : "cheapest_n_in",
"var_n" : 1,
"direction" : "below", // oder "above"
"plusAmount" : -10, // positiv: plus; negativ: minus
"plusCurrency" : "USD", // Wahrung oder "%"
// Entspricht "But never below the cheapest competitor in-stock minus 10.00 USD"
},
{}, // Diese zweite "But never"-Bedingungszeile ist leer
{
"target" : "cost",
"direction" : "below",
"plusAmount" : 5,
"plusCurrency" : "%",
// Entspricht "But never below my cost plus 5%"
}
],
}
...
],
},
...
]
}
Tabellen
spreadsheetDownload - Tabelle herunterladen
Entspricht den Möglichkeiten auf der Seite Export in deinem Konto.
Achte darauf, dass deine timeout großzügig genug eingestellt sind, denn die Erstellung großer Tabellen kann dauern.
EINFACHER GEHT ES SO: Klicke auf die Schaltfläche Show API equivalent auf der Export-Seite. Damit erzeugst du den vollständigen JSON-Aufruf und den curl-Befehl passend zu den gewählten Formularoptionen.
{ "actions" : [
{
"a" : "spreadsheetDownload",
"preset" : "Some Preset Name", // (optional) Statt der folgenden Parameter kannst du eine eigene oder unsere Voreinstellung nutzen
// Fur eigene Voreinstellungen: voller Name ohne Benutzernamen davor oder Wahrung dahinter.
// Fur unsere Vorgaben findest du Namen im Dropdown DIRECT DOWNLOAD auf der Export-Seite (mit Maus zeigen).
// "pricezag_backup" ist eine spezielle Backup-Voreinstellung (siehe "Special BACKUP format to re-import" bei DIRECT DOWNLOAD)
// Zusatzliche Variablen konnen Werte der Voreinstellung uberschreiben (z. B. Wahrung, Format, Kategorien).
"savePreset" : "My New Preset Name", // (optional) Folgende Parameter als neue Voreinstellung speichern (in UI und API nutzbar)
// AUSNAHME DER AUSNAHME: Bei savePreset kein Download, sondern normales JSON-Antwortobjekt.
"savePresetOverwrite" : 1, // (optional) Vorhandene Voreinstellung aus "savePreset" uberschreiben (sonst Fehler)
// WARNUNG: Uberschreiben entfernt ALLE bisherigen Werte; nicht nur einzelne Felder angeben.
// Um eine Vorlage umzubenennen oder zu löschen, verwende die Aktion spreadsheetPresetEdit weiter unten.
"downloadURL" : 1, // (optional) AUSNAHME: Statt der Datei gibt es normales JSON mit "fileURL",
// Offentliche Datei-URL ohne Anmeldung oder API-Schlussel. Datei 15 Minuten lang von uberall abrufbar.
// "ok" ist die Zeilenzahl; "fileSize" die Dateigrosse in Bytes.
"format" : "xlsx|xls|csv|csv-tab", // (Standard csv fur API)
"currency" : "USD", // (ERFORDERLICH ausser bei preset) Wahrung fur ALLE Betrage
"categories" : ["Category 1", "Category 2"], // Nur Produkte dieser Kategorien (sonst alle)
"historyPeriod" : "prev_6mo", // (optional, Standard "now")
// ZUERST: Lies die (?) zu historischen Zeitraumen auf der Export-Seite fur alle Details.
// "historyPeriod" bestimmt den historischen Zeitraum; "historyRow" teilt ihn in Zeilen pro Produkt.
// "now": keine Historie, nur aktuelle Daten (ohne "historyRow")
// "all": gesamte verfugbare Historie seit Anmeldung (oder der Produkte). KANN LANGSAM SEIN.
// "1234500000-1237800000": eigener Zeitraum (Epoch-Zeiten von-bis)
// "123h": letzte 123 Stunden, ohne Raster; Ende jetzt, Anfang mitten in einer Stunde moglich.
// "cur_123(d|wk|mo|yr)": letzte 123 Tage/Wochen/Monate/Jahre inklusive laufender Periode. "cur_2mo" am 10. = 40 Tage.
// "prev_123(d|wk|mo|yr)": vorherige 123 abgeschlossene Zeitraume. "prev_2mo" am 10. Feb. = Dez.+Jan. (62 Tage).
// Beginn von cur_* und prev_* (sowie Ende von prev_*) liegt bei Mitternacht; cur_* endet jetzt.
// "cur_2d" mittags umfasst daher 36 Stunden; "prev_2d" 48 Stunden bis vor 12 Stunden.
"historyRow" : "2w", // (erforderlich wenn "historyPeriod" nicht "now" ist)
// "historyRow" bestimmt den Zeitraum je Zeile (Periodendurchschnitt), mehrere Zeilen pro Produkt (ausser "all").
// "historyRow" ist die Unterteilung von "historyPeriod" in einzelne Produktzeilen.
// "all": Durchschnitt uber gesamten historyPeriod, eine Zeile pro Produkt.
// "123(d|wk|mo|qt|yr)": Kalenderintervalle von 123 Tagen/Wochen/Monaten/Quartalen/Jahren ab Mitternacht. 123 bei 1 optional ("wk" = "1wk")
// Download am Samstag mit historyRow:"7d": jede Zeile mittelt Samstag 00:00 bis Freitag 23:59.
// Bei historyRow:"1wk" gilt Montag 00:00 bis Sonntag 23:59; neueste Zeile ist laufende unvollstandige Woche.
// GRENZE 500.000 ZEILEN: UI und API lehnen historische Abfragen uber 500K Zeilen ab.
// Das kann bei historyRow:"day" und langem Zeitraum passieren, z. B. 365 Tage x 1400 Produkte.
// Falls benotigt, je Kategorie mit einigen Hundert Produkten eine Tabelle laden.
"timezone" : "America/Los_Angeles", // (optional, Standard "UTC") Linux-Pfad /usr/share/zoneinfo
// Leerzeichen werden durch Unterstriche ersetzt.
// Zeitzone wird nur fur kalenderbasierte history*-Zeitraume gebraucht (Mitternacht).
// UI nutzt Benutzerzeitzone; API hat keine Einstellung, daher in Anfrage angeben.
// ========== SPALTEN: ==========
// Mit column*-Variablen bestimmst du die Spalten (siehe Hilfe im Export-Formular)
// Standard 0 (nicht aufnehmen), ausser Code.
"columnCode" : 1, // Diese Spalte kann nicht entfernt werden: REF-CODE ist immer enthalten.
"columnName" : 1, // Produktname
"columnCategories" : 1, // Produktkategorien ("Category 1; Category 2" in einer Zelle)
"columnComments" : 1, // Produktkommentare
"columnCreated" : 1, // Erstellungsdatum YYYY/MM/DD (in unserem System)
"columnCustom" : 1, // Benutzerdefinierte Felder (Spalte je eindeutiger Variable aller Produkte)
"columnPrice" : 1, // Produktpreis in angefragter Wahrung (NICHT in Produktwahrung)
"columnCost" : 1, // Produktkosten (in ...)
"columnMargin" : 1, // Produktmarge in Prozent aus Preis und Kosten
"columnRank" : 1, // Mein Rang
"columnInRank" : 1, // Mein Rang unter verfügbaren Angeboten
"columnMyWebsite" : 1, // URL meiner Website
"columnReprice" : 1, // Repricing-Betrag (in ...)
"columnRepricingRule" : 1, // Name der Repricing-Regel
"columnRecommended" : 1, // Empfohlener Preis (siehe Export-Hilfe)
"columnCompUrls" : 1, // Wettbewerber-URLs (eine pro Spalte)
"columnCompUrlsJoin" : 1, // Wettbewerber-URLs (durch Leerzeichen in einer Zelle getrennt)
"columnCompMinMaxAvg" : 1, // Fugt 3 Spalten hinzu: Wettbewerber-Min/Max/Durchschnitt
"columnInCompMinMaxAvg" : 1, // Fugt 3 Spalten hinzu: Min/Max/Durchschnitt lagernder Wettbewerber
"columnCompPrice" : 1, // Eine Spalte je Wettbewerber mit Preis (in ...)
"columnCompStock" : 1, // Eine Spalte je Wettbewerber mit Bestand (123|IN|OUT)
"columnCompSales" : 1, // Eine Spalte je Wettbewerber mit Verkaufen/Woche
"columnCompRank" : 1, // Eine Spalte je Wettbewerber mit Rang unter allen (du eingeschlossen)
"columnCompInRank" : 1, // Eine Spalte je Wettbewerber mit Rang unter lagernden (du eingeschlossen)
// ========== VERSTECKTE ERWEITERTE PARAMETER: ==========
// Es gibt auch kaum dokumentierte inoffizielle Optionen, teils genutzt von "pricezag_backup".
"originalCurrencies" : 1, // Statt Zahlen in angegebener Wahrung gibt es Strings mit Originalwahrung ("123.90 USD")
"keepUrlLabels" : 1, // Normalerweise entfernen wir URL-Labels; damit bleiben sie erhalten (fur Backups).
"csvSeparator" : ";", // Anderes CSV-Trennzeichen statt Komma oder Tabulator.
"csvNoQuote" : 1, // Verhindert Anfuhrungszeichen (") in CSV. Das kann das Format ungultig machen.
}
] }
// Einfacher Weg zum Herunterladen eines CSV-Backups:
// curl --connect-timeout 15 --max-time 600 --retry 2 -X POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"spreadsheetDownload","preset":"pricezag_backup"}]}' -o pricezag-backup-20241225.csv
spreadsheetPresetEdit - Tabellen-Voreinstellung umbenennen oder löschen
Hiermit kannst du eine Voreinstellung nur UMBENENNEN oder LÖSCHEN. Zum Erstellen oder Ändern verwende die Aktion spreadsheetDownload oben.
{ "actions" : [
{
"a" : "spreadsheetPresetEdit",
"preset" : "Some Preset Name", // Aktueller Name der Voreinstellung
"newName" : "The Renamed Preset", // Diese Voreinstellung umbenennen
"delete" : 1, // Loscht diese "preset" aus dem Konto
// HINWEIS: Voreinstellungen in Auto-Exports konnen nicht geloscht werden (Fehler).
// Losche zuerst die geplanten Auto-Exports (siehe Export).
}
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "spreadsheetPresetEdit",
"ok" : 1,
},
...
]
}
spreadsheetAutoCreate - Automatischen Tabellenexport erstellen
{ "actions" : [
{
"a" : "spreadsheetAutoCreate",
"preset" : "The Preset Name",
"email" : "john@example.net",
"currency" : "USD", // (optional) Standard "preset": Wahrung der Voreinstellung nutzen
"attach" : "link", // (optional, Standard "attach") "attach" als Anhang, "link" als gehosteter Link
"everyMonday" : 1, // Tabelle jeden Montag senden
"everyTuesday" : 1, // ... usw. fur alle Tage bis "everySunday"
"everyMonthDay1" : 15, // Jeden 15. des Monats senden
"everyMonthDay2" : 21, // ... und auch jeden 21.
"everyMonthDay3" : "last", // ... und am letzten Tag jedes Monats
// everyMonthDay* von 0 bis 9, maximal 10 Tage im Monat
"time" : "3:59pm", // "15.59" wird auch als "3:59pm" erkannt. "0:9", "0.09", "00:09", "0:09am" sind gleichwertig.
"timezone" : "America/Los_Angeles", // (optional, Standard "UTC") Linux-Pfad /usr/share/zoneinfo
// Leerzeichen in Stadtnamen werden zu Unterstrichen.
}
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "spreadsheetAutoCreate",
"ok" : 1,
"id" : "5gwi6fqa", // Referenz-ID dieses automatischen Exports, falls du ihn später ändern möchtest (siehe Aktion spreadsheetAutoEdit unten)
},
...
]
}
spreadsheetAutoEdit - Automatischen Tabellenexport bearbeiten
{ "actions" : [
{
"a" : "spreadsheetAutoEdit",
"id" : "5gwi6fqa", // Referenz-ID des zu bearbeitenden Auto-Exports
// ID aus spreadsheetAutoCreate; steht auch im Titel des Edit-Popups fur Auto-Export in der UI.
"disabled" : 1, // (optional) 0 zum Aktivieren eines deaktivierten Auto-Exports
"delete" : 1, // (optional) Diesen Auto-Export vollstandig loschen
// ===== Die folgenden Felder (alle optional) entsprechen denen der Aktion spreadsheetAutoCreate oben =====
"preset" : "The Preset Name",
"email" : "john@example.net",
"currency" : "USD",
"attach" : "link",
"everyMonday" : 1, // WARNUNG: Sobald eine every*-Variable angegeben wird, werden alle bisherigen every*-Werte geloscht.
"everyMonthDay1" : 15, // Wer vorher "everyFriday"=1 hatte und "everyMonthDay3" setzt, verliert "everyFriday".
// ... und so weiter (siehe every* bei spreadsheetAutoCreate)
"time" : "3:59pm",
"timezone" : "America/Los_Angeles",
}
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "spreadsheetAutoEdit",
"ok" : 3, // Anzahl Anderungen
},
...
]
}
Wettbewerber und mehr
competitorDeleteAll - Wettbewerber aus allen Produkten oder Kategorien entfernen
WARNUNG: Die Wettbewerber-URLs werden sofort unwiderruflich aus deinem Konto gelöscht.
Dieselbe Funktion verwendet die Oberfläche, wenn du die Seite eines Wettbewerbers öffnest und auf Delete from all Products klickst oder eine Kategorieseite öffnest und das Symbol (X) in der Wettbewerberliste auswählst.
{ "actions" : [
...
{
"a" : "competitorDeleteAll",
"domain" : "competitordomain.com",
"categories" : ["The Category 1", "The Category 2"], // (optional) Wenn fehlend, musst du "allProducts" = 1 verwenden
"allProducts" : 1, // (optional) Aus allen Produkten entfernen (KEIN "categories" angeben)
// Entweder "categories" ODER "allProducts", niemals beide oder keines.
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "competitorDeleteAll",
"ok" : 10, // Anzahl entfernter URLs
},
...
]
}
mathEdit - Preisberechnungen für eine Wettbewerber-Domain festlegen oder bearbeiten
Klicke in deinem Konto auf die grünen Fragezeichen-Symbole, um Details zu den einzelnen Feldern zu erhalten.
{ "actions" : [
...
{
"a" : "mathEdit",
"domain" : "competitordomain.com",
"clear" : 1, // (optional) Alle Berechnungen fur diese Domain deaktivieren (bisherige Einstellungen loschen)
// Bei clear:1 keine weiteren Felder angeben, sonst Fehler.
"math" : [ // Array der anzuwendenden Berechnungsblocke
{ // Objekt eines Berechnungsblocks; alle Felder optional
"categories" : ["Category 1", "Category 2"], // Nur Produkte dieser Kategorien
"theirPriceMin" : 1234.90, // Nur wenn ihr Preis >= N ist
"theirPriceMinCurrency" : "USD", // Wahrung ("original" = Wahrung der Website)
"theirPriceMax" : 1234.90, // ... <= N
"theirPriceMaxCurrency" : "USD", // Wahrung (...)
"themMeMin" : -20.00, // Nur wenn [Wettbewerber - ich] >= N (siehe UI)
"themMeMinCurrency" : "USD", // Wahrung oder "%" deines Preises (NICHT "original")
"themMeMax" : -1.5, // ... <= N
"themMeMaxCurrency" : "%", // Wahrung (...)
"addPre" : -10.00, // Betrag vor dem Multiplizieren addieren (negativ zum Abziehen)
"addPreCurrency" : "USD", // Wahrung ("original" = Wahrung der Website)
"multiply" : 1.1, // Mit diesem Faktor multiplizieren
"divide" : 1.1, // ODER dividieren (nicht beide)
"addPost" : 5.00, // Betrag nach dem Multiplizieren addieren (negativ zum Abziehen)
"addPostCurrency" : "USD", // Wahrung (...)
// Klingt kompliziert? Sieh dir das einfache Beispiel unter der Antwort an.
},
... // Maximal 10 Blocke (in Reihenfolge angewendet)
],
// HINWEIS: Einzelne Felder/Blocke lassen sich derzeit nicht andern. Das "math"-Array ersetzt alles.
// HINWEIS: Block ohne Multiplikation/Division (fehlt oder 1) und ohne addPre/addPost ungleich 0 wird ignoriert;
// Werden alle ignoriert, entspricht das dem Loschen samtlicher Berechnungen mit clear:1.
// Mit anderen Worten: Eine Berechnung muss etwas bewirken, um gespeichert zu werden.
// TIPP: Um Berechnungen einer Domain vorubergehend ohne Loschen zu deaktivieren,
// verwende categories: ["Some Empty Existing Category"]
},
...
] }
ANTWORT:{
...
"actions" : [
...
{
"a" : "mathEdit",
"ok" : 3, // Anzahl geanderter Berechnungsblocke (Entfernen/Leeren zahlt auch)
},
...
]
}
EINFACHES BEISPIEL — 10 % Steuer für die gesamte Domain amazon.co.uk entfernen:{ "actions" : [
{
"a" : "mathEdit",
"domain" : "amazon.co.uk",
"math" : [
{
"divide" : 1.1
}
]
}
] }
Weitere Beispiele
▶ BEISPIEL 1 — Produktkosten aktualisieren
ANFRAGE:
{
"actions" : [
{
"a" : "productEdit",
"code" : "SKU-1234",
"cost" : 140.50,
"costCurrency" : "EUR"
}
]
}
ANTWORT:{
"ok" : 1, // ergabe 0, wenn SKU-1234 diese Kosten bereits hatte
"errors" : 0, // ergabe 1, wenn SKU-1234 nicht existierte
"actionsCount" : 1,
"actions" : [
{
"a" : "productEdit",
"ok" : 1 // 0 bei gleichen Kosten, -1 wenn Produkt nicht existiert
}
]
}
▶ BEISPIEL 2 — Nicht vorhandenes Produkt abrufen
ANFRAGE:
{
"actions" : [
{
"a" : "productGet",
"code" : "NON-EXISTING-SKU",
"currency" : "USD"
}
}
ANTWORT:{
"ok" : 0, // weil keine Aktion ok>0 zuruckgab
"errors" : 1, // weil eine Aktion ok<0 zuruckgab
"actionsCount" : 1,
"actions" : [
{
"a" : "productGet",
"ok" : -1, // so erkennst du den Fehler
"error" : "Sorry, the product #NON-EXISTING-SKU does not exist. Maybe someone else just removed or renamed it?"
}
]
}
▶ BEISPIEL 3 — Eine Kategorie, eine Repricing-Regel und danach zwei zugewiesene Produkte erstellen
ANFRAGE:
{
"actions" : [
{
"a" : "categoryCreate",
"name" : "My New Category"
},
{
"a" : "repricingCreate",
"name" : "My New Repricing Rule",
"init" : {
"target" : "cheapest_n",
"var_n" : 2,
"plusAmount" : 0,
"plusCurrency" : "%"
// Entspricht "Set my price at the mid-point between the 2 cheapest competitors"
},
"never" : [
{
"target" : "cost",
"direction" : "below",
"plusAmount" : 5,
"plusCurrency" : "%"
// Entspricht "But never below My Cost + 5%"
}
],
"charm" : "charm"
},
{
"a" : "productCreate",
"code" : "SKU-1001",
"name" : "My New Product 1",
"price" : 199.90,
"currency" : "USD",
"cost" : 112.00,
"costCurrency" : "USD",
"repricingRule" : "My New Repricing Rule", // derselbe Regelname wie gerade erstellt
"categories" : ["My New Category"], // derselbe Kategoriename wie gerade erstellt
// ... allerdings erstellt productCreate fehlende Kategorien, daher war categoryCreate nicht notig
"competitors" : ["https://...", "https://..."]
},
{
"a" : "productCreate",
"code" : "SKU-1002",
"name" : "My New Product 2",
"price" : 59.95,
"currency" : "USD",
"cost" : 31.50,
"costCurrency" : "USD",
"repricingRule" : "My New Repricing Rule",
"categories" : ["My New Category"],
"competitors" : ["https://...", "https://..."]
}
]
}
ANTWORT:{
"ok" : 4, // weil alle 4 Aktionen ok>0 lieferten
"errors" : 0, // weil keine Aktion ok<0 zuruckgab
"actionsCount" : 4,
"actions" : [
{
"a" : "categoryCreate",
"ok" : 1
},
{
"a" : "repricingCreate",
"ok" : 1
},
{
"a" : "productCreate",
"ok" : 1
},
{
"a" : "productCreate",
"ok" : 1
}
]
}
▶ BEISPIEL 4 — Zwei Kategorien in einer neuen zusammenführen und die ursprünglichen löschen
ANFRAGE:
{
"actions" : [
{
"a" : "categoryCopy",
"categoriesFrom" : ["Original Category 1", "Original Category 2"],
"deleteMode" : "cat",
// "removeMode":"cat" ist unnotig, da deleteMode beide Kategorien loscht
"categoriesTo" : ["A New Category"]
}
}
ANTWORT:{
"ok" : 1, // weil eine Aktion ok>0 zuruckgab
"errors" : 0, // weil keine Aktion ok<0 zuruckgab
"actionsCount" : 1,
"actions" : [
{
"a" : "categoryCopy",
"ok" : 3, // weil 3 Kategorien geandert wurden: 2 alte geloscht und 1 Ziel erstellt
"categoriesCreated" : 1,
"categoriesDeleted" : 2,
"categoriesModified" : 0,
"productsCount" : 123
}
]
}
▶ BEISPIEL 5 — Variable N und Richtung einer Benachrichtigungsregel ändern
ANFRAGE:
{
"actions" : [
{
"a" : "alertRuleEdit",
"email" : "john@example.net",
"ruleNumber" : 3,
"rule" : {
"var_n" : 1.5,
"direction" : "drop"
}
}
}
ANTWORT:{
"ok" : 1, // weil eine Aktion ok>0 zuruckgab
"errors" : 0, // weil keine Aktion ok<0 zuruckgab
"actionsCount" : 1,
"actions" : [
{
"a" : "alertRuleEdit",
"ok" : 2 // weil 2 Variablen erfolgreich geandert wurden
}
]
}
