PriceZag API — Preisdaten mit Ihren Systemen verbinden

Mit der JSON-API von PriceZag können Sie Preise und Bestände der Wettbewerber abrufen, Produkte und Preisregeln verwalten, Berichte herunterladen und Abläufe automatisieren.

Schnelles curl-Beispiel

Wir wissen, dass Entwickler gern zuerst funktionierenden Code sehen. Diese Befehle erstellen ein Testprodukt und rufen es anschließend ab. Ersetzen Sie MYAPIKEY durch Ihren 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 können Sie dieses Produkt abrufen:
curl -X POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"productGet","code":"000-SOME-TEST-PRODUCT"}]}' | python -mjson.tool
(entfernen Sie | python -mjson.tool, falls Sie dieses Werkzeug zum Formatieren der JSON-Antwort im Terminal nicht installiert haben)

Überblick

Was Sie mit der PriceZag API machen können

Mit der JSON-API von PriceZag können Ihre Skripte und Systeme direkt mit den von uns überwachten Preisen und Beständen arbeiten. Sie können 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.

Sie können auch Ihren bevorzugten KI-Assistenten bitten, die Skripte für Sie zu schreiben. Geben Sie ihm die URL dieser Dokumentation (https://pricezag.com/integrations/api), erklären Sie, was Sie automatisieren möchten, und nennen Sie Ihre Programmiersprache oder E-Commerce-Plattform. Halten Sie Ihren API-Schlüssel geheim und teilen Sie ihn nicht in einem KI-Chat.

PriceZag übernimmt die Überwachung innerhalb unserer Plattform; die API ist daher optional. Sie ist hilfreich, wenn Sie eigene Systeme mit diesen Daten verbinden möchten. Shopify und WooCommerce bieten außerdem direkte Integrationen.

API-Schlüssel und Berechtigungen

Öffnen Sie in Ihrem PriceZag-Konto Automation > API. Klicken Sie auf Reveal the current API key, um Ihren aktuellen Schlüssel anzuzeigen, oder auf Change the API key, um ihn zu ersetzen. Für beide Vorgänge müssen Sie Ihr Kontopasswort eingeben. Ihr Benutzer benötigt die entsprechende Berechtigung, um API-Schlüssel anzuzeigen oder zu erzeugen. Andernfalls wenden Sie sich an einen Kontoadministrator.

Halten Sie Ihren API-Schlüssel geheim. Damit können weitreichende Änderungen an Kontodaten bis hin zum Löschen vorgenommen werden. Speichern Sie den Schlüssel nicht in öffentlichen Repositories, im Browser-Code oder in KI-Chats. Wenn Ihnen jemand bei einer Integration hilft, richten Sie einen PriceZag-Benutzer mit passenden Berechtigungen ein und erneuern Sie den API-Schlüssel bei Bedarf.

Der API-Zugriff hängt von Ihrer Mitgliedschaft ab. Bei vollem Zugriff können Ihre Skripte mit allen Produkten arbeiten. Ohne vollen Zugriff erreicht die API nur die ersten zehn Produkte, alphanumerisch nach Referenzcode sortiert. Wenn Sie beispielsweise 1.000 Produkte mit Codes von SKU0001 bis SKU1000 haben, kann die API die Produkte von SKU0001 bis SKU0010 abrufen. Während der kostenlosen 14-tägigen Testphase ist der volle API-Zugriff enthalten. Sie können ihn auch als Option Ihrer Mitgliedschaft aktivieren.

API-Aktivitätsprotokoll und letzte Anfrage

Die Seite Automation > API in Ihrem Konto zeigt den Zeitpunkt der letzten API-Anfrage und die Schaltfläche API Activity Log. Prüfen Sie diese Angaben, wenn ein Skript nicht funktioniert: So sehen Sie, ob Anfragen PriceZag erreicht haben, und können 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 können Sie automatische Änderungen von den Änderungen einzelner Teammitglieder unterscheiden.

Anfrage-URL und Methoden

Alle API-Anfragen verwenden dieselbe HTTPS-URL. Senden Sie POST-Anfragen an diese Adresse und ersetzen Sie MYAPIKEY durch Ihren Schlüssel:

https://pricezag.com/api/v3/MYAPIKEY

Was Sie mit der API tun möchten (die "actions") und die Parameter stehen im JSON-Anfragetext und nicht in der URL.
Senden Sie ein JSON-Objekt mit einer oder mehreren Aktionen im POST-Body. Die URL bleibt gleich, egal ob Sie ein Produkt abrufen, Preise aktualisieren oder eine Tabelle herunterladen.

POST nicht möglich?
Als letzte Möglichkeit können Sie 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

Was wir eine Aktion nennen, ist ein Vorgang in Ihrem Konto: etwa Produktfelder bearbeiten, eine Repricing-Regel ändern oder die Preise sämtlicher Wettbewerber für ein Produkt abrufen.
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 Sie eine API-Anfrage senden, enthält Ihr JSON ein Array aller auszuführenden Aktionen, von 1 bis höchstens 1.000 pro Anfrage. Sie können 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 Sie eine Repricing-Regel erstellen und danach Produkte zuweisen, müssen die Aktionen in dieser Reihenfolge stehen, damit die Regel vor der Produktänderung existiert.
Weiter unten finden Sie die Liste aller verfügbaren Aktionen.

Ihr 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 Sie unverändert senden können. Entfernen Sie Kommentare und Platzhalter vor dem Senden. Die beiden curl -Beispiele oben enthalten dagegen gültige JSON-Daten.

Ihre gesamten POST-Daten müssen ein einziges JSON-Objekt sein {...} mit dem Array der auszuführenden Aktionen.
{
	"stopOnFailure"	: 1,  // (optional) Normalerweise wird die nächste Aktion auch nach einem Fehler ausgeführt. 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 außer "a" sind die für die jeweilige Aktion benötigten 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

Bei Fehlern im Anfrageformat oder beispielsweise bei deaktiviertem Konto gibt der Server text/plain zurück. Der Text enthält dann die Fehlermeldung.
Ist die Anfrage gültig, erhalten Sie normalerweise ein JSON als Antwort, ausgenommen einige ausdrücklich gekennzeichnete Aktionen (etwa der Tabellen-Download). Sie erkennen 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 Sie es einfach halten wollen, können Sie sich in Ihren Skripten auf diese Antwortcodes verlassen. Ansonsten liefert das zurückgegebene JSON-Objekt weitere Informationen:
{
	"ok"		: 15,  // Anzahl erfolgreich ausgeführter Aktionen (ok>0)
	"errors"	: 0,  // Anzahl der Aktionen mit Fehler (ok<0)
	"actionsCount"	: 20,  // Gesamtzahl der ursprünglich angefragten Aktionen (Länge des Arrays "actions")
	// HINWEIS: Daraus folgt, dass 5 Aktionen ok=0 lieferten (kein Fehler, aber keine Änderung).
	
	// Array aller angefragten Aktionen (in derselben Reihenfolge):
	"actions" : [
		...
		// Antwortobjekt für jede Aktion:
		{
			"a"	: "someActionName",
			"ok"	: 4,		// Ergebnis: >0 = Erfolg, 0 = keine Änderung, <0 = Fehler
						// 0 zum Beispiel, wenn Sie einen Produktpreis auf seinen bisherigen Wert setzen.
						// -1, wenn das Produkt nicht existiert.
						// >0 hängt von der Aktion ab. Oft ist es die Anzahl geänderter Felder oder Elemente.
			"error"	: "...",  // Fehlermeldung, wenn ok < 0
						// Unsere Fehlermeldungen sind sehr detailliert. Protokollieren Sie diese,
						// denn sie enthalten alle Informationen zur Fehleranalyse.
			...	// Weitere aktionsspezifische Rückgabedaten
		},
		...
	]
}

Beispiele?

Manchmal lässt sich etwas anhand von Beispielen leichter verstehen. Siehe weitere Beispiele ganz unten auf dieser Seite.

Anfragelimits und Zeitplanung

Eine Firewall schützt uns und Sie vor Angriffen oder Anfragefluten. Wenn sie einen Host blockiert, kann unsere Website wie ausgefallen wirken: keine Verbindung, keine Antwort, kein Ping.
Damit legitime Anfragen nicht blockiert werden:
► Verwenden Sie niemals einen falschen API-Schlüssel. Die Firewall toleriert nur wenige Fehlversuche (ebenso wie bei falschen Website-Passwörtern).
► Fassen Sie viele Aktionen in einer einzigen Anfrage und einem JSON-Objekt zusammen (maximal 1.000). Zum Erstellen von 1.000 Produkten senden Sie eine Anfrage, nicht 1.000.
► Wenn Sie viele Anfragen stellen müssen, warten Sie jeweils 500 ms dazwischen und verwenden Sie 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 Sie Anfragen regelmäßig planen, fügen Sie 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 finden Sie Parameter sowie Anfrage- und Antwortbeispiele. Über die linke Navigation gelangen Sie direkt zur jeweiligen Aktion.

Produkte

AktionZweck
productCreateNeues Produkt erstellen
productEditVorhandenes Produkt bearbeiten
productCompetitorsWettbewerber-URLs eines Produkts bearbeiten (ohne alle überschreiben zu müssen)
productCategoriesKategorien eines oder mehrerer Produkte bearbeiten (ohne alle überschreiben zu müssen)
productRepricingViele Produkte einer Repricing-Regel zuweisen
productDeleteEin oder mehrere Produkte löschen
productGetProdukt abrufen (einschließlich Wettbewerberdaten)
productGetAllAlle Produkte abrufen (einschließlich Wettbewerberdaten)

Kategorien

AktionZweck
categoryCreateNeue Kategorie erstellen
categoryEditVorhandene Kategorie bearbeiten
categoryDeleteEine oder mehrere Kategorien löschen
categoryCopyProdukte zwischen Kategorien kopieren oder verschieben
categoryGetKategorie abrufen
categoryGetAllAlle Kategorien abrufen

Benachrichtigungen

AktionZweck
alertRecipientCreateNeuen Benachrichtigungsempfänger erstellen
alertRecipientEditEmpfänger und/oder dessen Benachrichtigungsregeln bearbeiten
alertRecipientDeleteBenachrichtigungsempfänger löschen
alertRuleEditVorhandene Benachrichtigungsregel bearbeiten
alertRuleCreate ?Diese Aktion existiert nicht. Verwenden Sie stattdessen alertRecipientEdit mit einem "rulesAdd"-Array.
alertRuleDelete ?Diese Aktion existiert nicht. Verwenden Sie stattdessen alertRecipientEdit mit einem "rulesRemove"-Array.
alertGetAllAlle Empfänger und Benachrichtigungsregeln abrufen

Repricing-Regeln

AktionZweck
repricingCreateRepricing-Regel erstellen
repricingEditVorhandene Repricing-Regel bearbeiten
repricingDeleteRepricing-Regel löschen
repricingGetAllAlle Repricing-Regeln abrufen

Tabellen

AktionZweck
spreadsheetDownloadTabelle herunterladen
spreadsheetPresetEditTabellen-Voreinstellung umbenennen oder löschen
spreadsheetAutoCreateAutomatischen Tabellenexport erstellen
spreadsheetAutoEditAutomatischen Tabellenexport bearbeiten

Wettbewerber und mehr

AktionZweck
competitorDeleteAllWettbewerber aus allen Produkten oder Kategorien entfernen
mathEditPreisberechnungen für eine Wettbewerber-Domain festlegen oder bearbeiten

Produkte

productCreate - Neues Produkt erstellen

Dieselbe Funktion wird in der Benutzeroberfläche auf der Seite New Product verwendet.
{ "actions" : [
	...
	{
		"a"		: "productCreate",
		"code"		: "UNIQUE-REF-CODE",  // 1 bis 80 ([a-z\d][a-z\d_-]{0,78}[a-z\d]); ohne Groß-/Kleinschreibung (wird großgeschrieben)
		"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 für Ihren 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 (Groß-/Kleinschreibung beachten), ohne "custom_"-Präfix (insgesamt 47).
		// Wert maximal 500 Bytes (oft Zeichen). Sie können eine Zahl setzen (custom_varname:123),
		// aber wir geben immer Strings zurück (custom_varname:"123"); konvertieren Sie diese bei Bedarf.
		// Zum Löschen eines benutzerdefinierten Feldes Wert "" setzen. Das gilt für productEdit, nicht productCreate.
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "productCreate",
			"ok"	: 1,
			"code"	: "REF-CODE",  // Endgültiger Code in der Datenbank (Sonderzeichen im Code können angepasst werden)
		},
		...
	]
}

productEdit - Vorhandenes Produkt bearbeiten

Dieselbe Funktion wird auch beim Bearbeiten eines Produktfelds in der Oberfläche verwendet. Die Oberfläche sendet jedes Feld einzeln; über die API können Sie beispielsweise Name und Preis mit einem einzigen Aufruf ändern.
{ "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 ÜBERSCHRIEBEN.
		// Wenn Sie nur Wettbewerber zur bestehenden Liste hinzufügen oder daraus entfernen möchten, verwenden Sie stattdessen die Aktion productCompetitors.
		"categories"	: ["The Category 1", "The Category 2"],  // Falls angegeben, ÜBERSCHREIBT 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, entfernen Sie alte mit "".
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "productEdit",
			"ok"	: 3,  // Anzahl der Änderungen (z. B. mein Preis + 2 Wettbewerber-URLs = 3)
			"code"	: "REF-CODE",  // Endgültiger neuer Code in der Datenbank (Sonderzeichen können angepasst werden)
		},
		...
	]
}

productCompetitors - Wettbewerber-URLs eines Produkts bearbeiten

Bearbeiten Sie die Wettbewerber-URLs eines Produkts, ohne alle überschreiben zu müssen (anders als bei der Aktion productEdit ).
{ "actions" : [
	...
	{
		"a"			: "productCompetitors",
		"code"			: "REF-CODE",
		"competitorsAdd"	: ["https://...", "https://..."],  // (optional) Diese Wettbewerber-URLs zu vorhandenen hinzufügen
		"competitorsRemove"	: ["https://...", "example.com/a0ff80...5f00", "example.net"],  // (optional) Diese Wettbewerber entfernen. Jeder Eintrag kann sein:
		// > Die URL (einschließlich 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" können auch Strings statt Arrays mit einem Element sein.
		// Zuerst wird entfernt und dann hinzugefügt: Sie können eine ganze Domain entfernen und eine URL davon hinzufügen.
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"			: "productCompetitors",
			"ok"			: 3,  // Anzahl geänderter Wettbewerber-URLs
			"competitorsAdded"	: 2,  // Anzahl zum Produkt hinzugefügter Wettbewerber-URLs
			"competitorsRemoved"	: 1,  // Anzahl aus dem Produkt entfernter Wettbewerber-URLs
			// FEHLER:
			// > Vorhandene URL hinzufügen 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

Bearbeiten Sie die Kategorien eines oder mehrerer Produkte, ohne alle überschreiben zu müssen (anders als bei productEdit).
Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie All Products öffnen, Produkte auswählen und unter Selected Products auf Edit Categories klicken. Dort finden Sie weitere Erläuterungen.
Sie können sich auch die Aktion categoryEdit ansehen und entscheiden, welche besser passt.
{ "actions" : [
	...
	{
		"a"			: "productCategories",
		"code"			: "REF-CODE",  // Groß-/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 gelöscht.
		"categoriesAdd"		: ["The Category 1", "The Category 2"],  // (optional) Danach zu diesen Kategorien hinzufügen (fehlende werden erstellt)
		"categoriesAddClear"	: 1,  // (optional) Zuerst Zielkategorien leeren, denen Produkte zugewiesen werden
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "productCategories",
			"ok"	: 3,  // Anzahl geänderter Produkte
		},
		...
	]
}

productRepricing - Viele Produkte einer Repricing-Regel zuweisen

Weise bis zu 100.000 Produkte einer Repricing-Regel zu.
Dies bewirkt dasselbe wie die Aktion productEdit. Da eine Anfrage höchstens 1.000 Aktionen enthält, bräuchten Sie mit productEdit für 50.000 Produkte ganze 50 Anfragen. Das wäre deutlich langsamer.
Wenn Sie nur wenige Produkte ändern möchten, können Sie stattdessen productEdit verwenden.
{ "actions" : [
	...
	{
		"a"			: "productRepricing",
		"repricingRule"		: "The Rule Name",  // ohne Groß-/Kleinschreibung; "" (vorhandener leerer String) bedeutet keine Regel (Repricing aus)
		"products"		: ["REF-CODE-1", "REF-CODE-2"],  // ohne Groß-/Kleinschreibung (maximal 100.000)
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"		: "productRepricing",
			"ok"		: 10,  // Anzahl geänderter Produkte
			// Wenn alle Produkte diese Regel bereits hatten, ist das Ergebnis ok=0.
		},
		...
	]
}

productDelete - Ein oder mehrere Produkte löschen

WARNUNG: Das Produkt und seine Wettbewerber-URLs werden sofort und unwiderruflich aus Ihrem Konto gelöscht.
Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie All Products öffnen, Produkte auswählen und unter Selected Products auf Delete klicken.
{ "actions" : [
	...
	{
		"a"	: "productDelete",
		"code"	: "REF-CODE",  // Groß-/Kleinschreibung egal (String), ODER:
		"code"	: ["REF-CODE-1", "REF-CODE-2"],  // kann auch ein Array zum Löschen mehrerer Produkte sein (maximal 100.000)
		"deleteEmptyCategories"	: 1,  // Damit wird jede Kategorie, die dadurch leer wird,
		// so werden dadurch leer gewordene Kategorien ebenfalls gelöscht
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "productDelete",
			"ok"	: 2,  // Anzahl erfolgreich gelöschter Produkte
		},
		...
	]
}

productGet - Produkt abrufen

{ "actions" : [
	...
	{
		"a"			: "productGet",
		"code"			: "REF-CODE",  // ohne Groß-/Kleinschreibung
		"currency"		: "EUR",  // (optional) Beträge in diese Währung statt in die Produktwahrung umrechnen
		"withStats"		: 1,  // (optional) Statistikobjekt zurückgeben
		"noCompetitors"		: 1,  // (optional) Wettbewerber-Array weglassen (kleinere Antwort)
		"noComments"		: 1,  // (optional) Kommentare nicht zurückgeben (...)
		"withScreenshots"	: 1,  // (optional) URL des neuesten Screenshots jedes Wettbewerbers zurückgeben
		"sickMax"		: 2,  // (optional, Standard 1) 0-3; nur URLs bis Fehlerstufe N zurückgeben
	},
	...
] }
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,  // Ihr eigener Preis, immer in Originalwährung
			"currency"		: "USD",  // Originalwährung von "price"
			"convCurrency"		: "EUR",  // Währung der umgerechneten Beträge ("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 Währung von "currency" 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 für Statistiken, unabhangig von "sickMax".
				// Alle Beträge sind in "convCurrency", also der angegebenen "currency" oder Originalwährung des Produkts.
				// WARNUNG: Wenn kein Betrag vorhanden ist (z. B. compIn* ohne lagernde Wettbewerber), ist der Wert 0.
				"rank"			: 1.23,  // Ihr Preisrang (1 = niemand ist günstiger)
				"rankIn"		: 1.23,  // Ihr 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 Ihrem Preis und dem Durchschnitt (negativ = Sie sind günstiger)
				"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://...",  // Einschließlich 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 Währung
					"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 über diesen langen Link erreichbar)
					"confidence"	: 98,
					// Konfidenz in Prozent für den erkannten Preis (siehe (?) beim Produkt)
					// Unter 70 % (anpassbar) markieren wir den Preis mit einem Fragezeichen als "unzuverlässig".
					// 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 Ihre benutzerdefinierten Felder. Für Erklärungen öffnen Sie
				// ein Produkt in der Oberfläche und klicken Sie 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 löschen.
				...
			}
		},
		...
	]
}

productGetAll - Alle Produkte abrufen

Achten Sie darauf, dass Ihre timeout-Einstellungen ausreichend hoch sind. Die Bearbeitung kann je nach Anzahl der Produkte und Wettbewerber dauern.
{ "actions" : [
	...
	{
		"a"			: "productGetAll",
		"currency"		: "EUR",  // (optional) Beträge in diese Währung statt in die Währung jedes Produkts umrechnen
		"withStats"		: 1,  // (optional) Statistikobjekt zurückgeben
		"noCompetitors"		: 1,  // (optional) Wettbewerber-Array weglassen (kleinere Antwort)
		"noComments"		: 1,  // (optional) Kommentare nicht zurückgeben (...)
		"withScreenshots"	: 1,  // (optional) URL des neuesten Screenshots jedes Wettbewerbers zurückgeben
		"sickMax"		: 2,  // (optional, Standard 1) 0-3; nur URLs bis Fehlerstufe N zurückgeben
	},
	...
] }
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)
				...
			],
		},
		...
	]
}
Sehen Sie sich auch die Aktion categoryGet an.

Kategorien

categoryCreate - Neue Kategorie erstellen

Dies ist dieselbe Funktion, die die Benutzeroberfläche auf der Seite Categories beim Klick auf die Schaltfläche New Category. Über die API können Sie der Kategorie zusätzlich schon bei der Erstellung Produkte zuweisen.
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

Sie können sich auch die Aktion productCategories ansehen und entscheiden, welche besser passt.
{ "actions" : [
	...
	{
		"a"			: "categoryEdit",
		"name"			: "The Category Name",		// ohne Groß-/Kleinschreibung
		"newName"		: "The Category Renamed",  // (optional)
		"products"		: ["REF-CODE-1", "REF-CODE-2"],  // (optional) Produktliste überschreiben
		"productsAdd"		: ["REF-CODE-1", "REF-CODE-2"],  // (optional) Produkte zur Kategorie hinzufügen
		"productsRemove"	: ["REF-CODE-3", "REF-CODE-4"],  // (optional) Produkte aus Kategorie entfernen (NICHT löschen)
		"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, verwenden Sie "products" : []
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"			: "categoryEdit",
			"ok"			: 5,  // Anzahl der Änderungen
			// (Umbenennen und Kommentaranderung zahlen je 1; ebenso jedes hinzugefügte/entfernte Produkt)
			"name"			: "The Category Name",  // neuer Name nach Umbenennung, sonst alter Name
			"productsCount"		: 30,  // Neue Produktanzahl der Kategorie (ob geändert oder nicht)
			"productsAdded"		: 2,  // Anzahl zur Kategorie hinzugefügter Produkte
			"productsRemoved"	: 2,  // Anzahl aus der Kategorie entfernter Produkte
		},
		...
	]
}

categoryDelete - Eine oder mehrere Kategorien löschen

Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie Categories öffnen, Kategorien auswählen und unter Selected Categories auf Delete klicken.
{ "actions" : [
	...
	{
		"a"			: "categoryDelete",
		"name"			: "The Category Name",  // Groß-/Kleinschreibung egal (String), ODER:
		"name"			: ["Category 1", "Category 2"],  // kann auch ein Array zum Löschen mehrerer Kategorien sein (maximal 1000)
		"deleteProducts"	: 1,
		// Standardmassig wird die Kategorie gelöscht; ihre Produkte bleiben bestehen,
		// aber mit deleteProducts werden alle Produkte der Kategorie ohne Bestätigung gelöscht,
		// und deren Wettbewerber-URLs werden ebenfalls unwiderruflich gelöscht!
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"			: "categoryDelete",
			"ok"			: 2,  // Anzahl gelöschter Kategorien
			"productsCount"		: 123,  // Anzahl der von diesen Kategorien betroffenen Produkte
			"productsDeleted"	: 123,  // Anzahl aufgrund der Option "deleteProducts" gelöschter Produkte
			// HINWEIS: Ein Produkt in mehreren angegebenen Kategorien zahlt nur einmal
		},
		...
	]
}

categoryCopy - Produkte zwischen Kategorien kopieren oder verschieben

Kopieren oder verschieben Sie Produkte aus passenden Kategorien in andere neue oder vorhandene Kategorien. Damit können Sie Kategorien auch ZUSAMMENFÜHREN (siehe Beispiele am Seitenende).
Dabei werden keine Produkte gelöscht, sondern lediglich Kategorien zugeordnet oder entzogen.
Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie Categories öffnen, Kategorien auswählen und unter Selected Categories auf Copy & More klicken. Dort finden Sie weitere Erläuterungen.
{ "actions" : [
	...
	{
		"a"			: "categoryCopy",
		"categoriesFrom"	: ["Category 1", "Category 2"],  // Produkte aus diesen Kategorien auswählen (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" hinzugefügt (kopieren statt verschieben)
		"deleteMode"		: "cat",  // (optional) Die angegebenen "categoriesFrom" nach dem Kopieren löschen
		"deleteMode"		: "all",  // (optional) Alle Kategorien dieser Produkte löschen
		// 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 geänderter Kategorien (Quelle und Ziel)
			// "ok" ist die Summe von categoriesModified + categoriesCreated + categoriesDeleted
			"categoriesModified"	: 2,  // Anzahl geänderter bestehender Kategorien (Quelle und Ziel)
			"categoriesCreated"	: 1,  // Anzahl neu erstellter Kategorien
			"categoriesDeleted"	: 0,  // Anzahl aufgrund von "deleteMode" gelöschter 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 Groß-/Kleinschreibung
		"currency"	: "EUR",  // (ERFORDERLICH bei withStats oder withProducts) Währung für die Statistiken
		"withStats"	: 1,  // auch Statistiken zurückgeben (langsamer)
		"withProducts"	: 1,  // auch Produkte dieser Kategorie zurückgeben (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.
				// Für Details wählen Sie die Werte als Spalten in der Kategorienliste aus und klicken auf (?).
				// Alle Beträge 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 Ihres 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,  // Ihr durchschnittlicher Preisrang (1 = niemand ist günstiger)
				"rankInAvg"		: 1.23,  // Ihr 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 Ihrem Preis und den Wettbewerbern (negativ = Sie sind günstiger)
				"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

Im Unterschied zu categoryGet gibt die Aktion categoryGetAll keine vollständigen Produktobjekte zurück. Ein Produkt kann zu mehreren Kategorien gehören; dadurch würden die Daten sehr groß und redundant. Wenn Sie Produktdaten benötigen, verwenden Sie categoryGet für jede Kategorie oder productGetAll und sortieren die Ergebnisse anschließend nach Kategorien.
{ "actions" : [
	...
	{
		"a"		: "categoryGetAll",
		"withStats"	: 1,  // auch Statistiken zurückgeben (langsamer)
		"noComments"	: 1,  // Kommentare weglassen (weniger Daten)
		"noProducts"	: 1,  // Produkt-Array weglassen (...)
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"		: "categoryGetAll",
			"ok"		: 10,  // Gesamtzahl Kategorien (Länge 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), außer bei noProducts=1
					"stats"		: {
						// Bei "withStats" dasselbe Statistikobjekt wie bei der Aktion categoryGet (direkt oben)
						...
					},
				}
				...
			],
		},
		...
	]
}

Benachrichtigungen

alertRecipientCreate - Neuen Benachrichtigungsempfänger erstellen

Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie unter Alerts auf New Recipient klicken.
Klicken Sie in Ihrem 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 für SMS-Alarme sein; siehe UI-Hilfe
		"name"		: "john",  // Einfacher Anzeigename (meist Vorname; ohne Groß-/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.
				// Suchen Sie Ihre 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

Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie unter Alerts beim jeweiligen Empfänger auf Settings oder Rules klicken.
Klicken Sie in Ihrem 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 überschreiben (leeres Array entfernt alle)
				  // Kein "rules"-Array angeben, wenn vorhandene Regeln bleiben sollen
		"rulesAdd"	: [ // (optional) Diese Regeln zu den vorhandenen hinzufügen
			...
			{  // DAS IST DAS FORMAT EINES REGELOBJEKTS:
				"name"		: "me_cross_avg",  // Gehen Sie zu Alerts > [Rules] > [+ New Rule] und wählen Sie 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",  // ... geben Sie deshalb die benötigten Parameter an,
				"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 Groß-/Kleinschreibung)
				"urlExclude"	: "amazon",  // (optional, ohne Groß-/Kleinschreibung)
				// "ruleNumber" identifiziert jede Regel (z. B. zum Bearbeiten oder Löschen).
				// Beim Abrufen der Regeln wird es angezeigt; Sie können es aber nicht selbst setzen.
			}
			...
		],
		"rulesRemove"	: [1,4,7],  // (optional) "ruleNumber" der zu entfernenden Regeln
					// Diese "ruleNumber" erhalten Sie von der Aktion alertGetAll weiter unten.
					// HINWEIS: Um alle Regeln zu entfernen, verwenden Sie "rules" = [].
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "alertRecipientEdit",
			"ok"	: 3,  // Anzahl Änderungen (Variablen plus hinzugefügte/entfernte Regeln)
		},
		...
	]
}

alertRecipientDelete - Benachrichtigungsempfänger löschen

Die Löschung ist endgültig. Alle Regeln und der Verlauf dieses Empfängers werden sofort unwiderruflich gelöscht.
{ "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

Hiermit ändern Sie eine vorhandene Benachrichtigungsregel, ohne andere zu ersetzen oder hinzuzufügen. So können Sie etwa die Variable N ändern oder die Regel aktivieren bzw. deaktivieren.
Um eine Regel zu entfernen, verwenden Sie das Array "rulesRemove" der Aktion alertRecipientEdit . Um eine neue hinzuzufügen, verwenden Sie dessen 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 finden Sie 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 geänderter Variablen
		},
		...
	]
}

alertGetAll - Alle Empfänger und Benachrichtigungsregeln abrufen

{ "actions" : [
	...
	{
		"a"	: "alertGetAll",
		// Diese Aktion benötigt keine Parameter
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"		: "alertGetAll",
			"ok"		: 3,  // Anzahl Empfanger (Länge 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 Sie diese Regel über die Aktion alertRuleEdit oben bearbeiten können
							"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

Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie unter Repricing auf New Repricing Rule klicken.
Klicken Sie in Ihrem Konto auf die grünen Fragezeichen-Symbole, um Details zu den einzelnen Feldern zu erhalten.
Wie weisen Sie der Regel Produkte zu? Bearbeiten Sie 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 benötigt
			"plusAmount"	: -2,  // positiv: daruber; negativ: darunter
			"plusCurrency"	: "%",  // Währung (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 ausgeführt (maximal 10)
			{
				"target"	: "cheapest_n_in",  // (siehe Liste unten)
				"var_n"		: 1,  // nur wenn das Ziel die Variable N benötigt
				"direction"	: "below",  // oder "above"
				"plusAmount"	: -10,  // positiv: plus; negativ: minus (auch bei 0 erforderlich)
				"plusCurrency"	: "USD",  // Währung 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 Groß-/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",  // Endgültiger Name in der Datenbank (Sonderzeichen können angepasst werden)
		},
		...
	]
}

repricingEdit - Vorhandene Repricing-Regel bearbeiten

Ändert eine vorhandene Repricing-Regel.
Siehe repricingCreate oben, um die Variablen zu verstehen.
Damit ändern Sie nur die Regel selbst, nicht die zugewiesenen Produkte. Zum Zuweisen von Produkten verwenden Sie productEdit oder productRepricing.
{ "actions" : [
	...
	{
		"a"		: "repricingEdit",
		"name"		: "The Rule Name",  // ohne Groß-/Kleinschreibung
		"newName"	: "The Rule Renamed",  // (optional) maximal 50 Zeichen
		"init"		: { // (optional) Falls angegeben, Variablen des Initialisierers überschreiben (siehe repricingCreate)
			"plusAmount"	: 1,  // z. B. nur "plusAmount" überschreiben und andere Variablen behalten
			// WARNUNG: Wenn das neue "target" eine N-Variable braucht, müssen Sie "var_n" angeben
		},
		"never"		: [...], // (optional) Sie können das gesamte "never"-Array ersetzen; meist ist never_* besser
		// "never":[] entfernt alle Bedingungen. Weglassen behalt sie.
		"never_0"	: { // (optional) Erstes "but never"-Objekt überschreiben (Index 0)
			"var_n"		: 2,  // z. B. nur "var_n" überschreiben 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; benötigt alle Variablen wie repricingCreate
		// "never_9" ist das Maximum; das "never"-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 Änderungen (z. B. Variable aus never_N, eine aus "init" und "charm")
			"name"	: "The Rule Name",  // Endgültiger neuer Name in der Datenbank (Sonderzeichen können angepasst werden)
		},
		...
	]
}

repricingDelete - Repricing-Regel löschen

Die Löschung ist endgültig. Die Regel wird sofort unwiderruflich gelöscht. Produkte, die sie nutzten, haben danach keine Regel mehr und können nicht mehr automatisch neu bepreist werden.
{ "actions" : [
	...
	{
		"a"		: "repricingDelete",
		"name"		: "The Rule Name",  // ohne Groß-/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

Sehen Sie sich zuerst repricingCreate oben an: Das Antwortformat ähnelt stark den an repricingCreate gesendeten Daten.
{ "actions" : [
	...
	{
		"a"	: "repricingGetAll",
		// Diese Aktion benötigt 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 benötigt, sonst fehlend
						"plusAmount"	: -2,  // positiv: daruber; negativ: darunter
						"plusCurrency"	: "%",  // Währung (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 ausgeführt
						{
							"target"	: "cheapest_n_in",
							"var_n"		: 1,
							"direction"	: "below",  // oder "above"
							"plusAmount"	: -10,  // positiv: plus; negativ: minus
							"plusCurrency"	: "USD",  // Währung 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

Diese Aktion ist eine AUSNAHME: Sie darf nicht mit anderen Aktionen kombiniert werden und gibt eine Tabellendatei statt eines JSON-Antwortobjekts zurück. (außer wenn Sie "savePreset" oder "downloadURL" wie unten beschrieben verwenden)
Diese Funktion entspricht den Exportmöglichkeiten auf der Seite Export in Ihrem Konto.
Achten Sie darauf, dass Ihre timeout-Einstellungen ausreichend hoch sind, denn die Erstellung großer Tabellen kann dauern.
EINFACHER GEHT ES SO: Klicken Sie auf die Schaltfläche Show API equivalent auf der Export-Seite. Damit erzeugen Sie 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 können Sie eine eigene oder unsere Voreinstellung nutzen
			// Für eigene Voreinstellungen: voller Name ohne Benutzernamen davor oder Währung dahinter.
			// Für unsere Vorgaben finden Sie 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 können Werte der Voreinstellung überschreiben (z. B. Währung, 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" überschreiben (sonst Fehler)
			// WARNUNG: Überschreiben entfernt ALLE bisherigen Werte; nicht nur einzelne Felder angeben.
			// Um eine Vorlage umzubenennen oder zu löschen, verwenden Sie die Aktion spreadsheetPresetEdit weiter unten.
		"downloadURL"	: 1,  // (optional) AUSNAHME: Statt der Datei gibt es normales JSON mit "fileURL",
			// Öffentliche Datei-URL ohne Anmeldung oder API-Schlüssel. Datei 15 Minuten lang von überall abrufbar.
			// "ok" ist die Zeilenzahl; "fileSize" die Dateigrosse in Bytes.
		"format"	: "xlsx|xls|csv|csv-tab",  // (Standard csv für API)
		"currency"	: "USD",  // (ERFORDERLICH außer bei preset) Währung für ALLE Beträge
		"categories"	: ["Category 1", "Category 2"],  // Nur Produkte dieser Kategorien (sonst alle)
		"historyPeriod"	: "prev_6mo",  // (optional, Standard "now")
			// ZUERST: Lesen Sie die Erklärungen bei (?) zu historischen Zeiträumen auf der Export-Seite für 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 möglich.
			// "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 (außer "all").
			// "historyRow" ist die Unterteilung von "historyPeriod" in einzelne Produktzeilen.
			// "all": Durchschnitt über 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 über 500K Zeilen ab.
			// Das kann bei historyRow:"day" und langem historyPeriod-Zeitraum passieren, z. B. 365 Tage x 1400 Produkte.
			// Falls benötigt, 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 für kalenderbasierte history*-Zeitraume gebraucht (Mitternacht).
			// UI nutzen Benutzerzeitzone; API hat keine Einstellung, daher in Anfrage angeben.
		// ========== SPALTEN: ==========
		// Mit column*-Variablen bestimmen Sie die Spalten (siehe Hilfe im Export-Formular)
		// Standard 0 (nicht aufnehmen), außer 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 Währung (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 (einschließlich Ihrer eigenen Position)
		"columnCompInRank"	: 1,  // Eine Spalte je Wettbewerber mit Rang unter lagernden (einschließlich Ihrer eigenen Position)
		// ========== VERSTECKTE ERWEITERTE PARAMETER: ==========
		// Es gibt auch kaum dokumentierte inoffizielle Optionen, teils genutzt von "pricezag_backup".
		"originalCurrencies"	: 1,  // Statt Zahlen in angegebener Währung gibt es Strings mit Originalwährung ("123.90 USD")
		"keepUrlLabels"		: 1,  // Normalerweise entfernen wir URL-Labels; damit bleiben sie erhalten (für Backups).
		"csvSeparator"		: ";",  // Anderes CSV-Trennzeichen statt Komma oder Tabulator.
		"csvNoQuote"		: 1,  // Verhindert Anführungszeichen (") in CSV. Das kann das Format ungültig 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

Entspricht der Funktion in Ihrem Konto, wenn Sie auf der Seite Export auf Edit Presets klicken.
Hiermit können Sie eine Voreinstellung nur UMBENENNEN oder LÖSCHEN. Zum Erstellen oder Ändern verwenden Sie 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 können nicht gelöscht werden (Fehler).
		// Losche zuerst die geplanten Auto-Exports (siehe Export).
	}
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "spreadsheetPresetEdit",
			"ok"	: 1,
		},
		...
	]
}

spreadsheetAutoCreate - Automatischen Tabellenexport erstellen

Entspricht der Funktion in Ihrem Konto, wenn Sie auf der Seite Export auf Add a new Auto-Export klicken.
{ "actions" : [
	{
		"a"			: "spreadsheetAutoCreate",
		"preset"		: "The Preset Name",
		"email"			: "john@example.net",
		"currency"		: "USD",  // (optional) Standard "preset": Währung der Voreinstellung nutzen
		"attach"		: "link",  // (optional, Standard "attach") "attach" als Anhang, "link" als gehosteter Link
		"everyMonday"		: 1,  // Tabelle jeden Montag senden
		"everyTuesday"		: 1,  // ... usw. für 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 Sie ihn später ändern möchten (siehe Aktion spreadsheetAutoEdit unten)
		},
		...
	]
}

spreadsheetAutoEdit - Automatischen Tabellenexport bearbeiten

Entspricht der Funktion in Ihrem Konto auf der Seite Export, wenn Sie in der Liste unter AUTO-EXPORT TO EMAIL auf eine der Schaltflächen Edit klicken.
{ "actions" : [
	{
		"a"			: "spreadsheetAutoEdit",
		"id"			: "5gwi6fqa",  // Referenz-ID des zu bearbeitenden Auto-Exports
			// ID aus spreadsheetAutoCreate; steht auch im Titel des Edit-Popups für Auto-Export in der UI.
		"disabled"		: 1,  // (optional) 0 zum Aktivieren eines deaktivierten Auto-Exports
		"delete"		: 1,  // (optional) Diesen Auto-Export vollständig löschen
		// ===== 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 gelöscht.
		"everyMonthDay1"	: 15,  // Wer vorher "everyFriday"=1 hatte und "everyMonthDay3" setzen, verliert "everyFriday".
		// ... und so weiter (siehe every* bei spreadsheetAutoCreate)
		"time"			: "3:59pm",
		"timezone"		: "America/Los_Angeles",
	}
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "spreadsheetAutoEdit",
			"ok"	: 3,  // Anzahl Änderungen
		},
		...
	]
}

Wettbewerber und mehr

competitorDeleteAll - Wettbewerber aus allen Produkten oder Kategorien entfernen

Entfernt die URLs eines Wettbewerbers gesammelt, entweder aus allen Produkten oder nur aus Produkten bestimmter Kategorien.
WARNUNG: Die Wettbewerber-URLs werden sofort unwiderruflich aus Ihrem Konto gelöscht.
Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie die Seite eines Wettbewerbers öffnen und auf Delete from all Products klicken oder auf einer Kategorieseite das Symbol (X) in der Wettbewerberliste auswählen.
{ "actions" : [
	...
	{
		"a"		: "competitorDeleteAll",
		"domain"	: "competitordomain.com",
		"categories"	: ["The Category 1", "The Category 2"],  // (optional) Wenn fehlend, müssen Sie "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

Dieselbe Funktion wird in der Benutzeroberfläche verwendet, wenn Sie unter Domains auf die Domain eines Wettbewerbers und anschließend auf Mathematically alter the price klicken. Alles, was Sie in diesem Formular einstellen können, lässt sich auch über die API-Aktion mathEdit einstellen.
Klicken Sie in Ihrem 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 für diese Domain deaktivieren (bisherige Einstellungen löschen)
		// 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",  // Währung ("original" = Währung der Website)
				"theirPriceMax"		: 1234.90,  // ... <= N
				"theirPriceMaxCurrency"	: "USD",  // Währung (...)
				"themMeMin"		: -20.00,  // Nur wenn [Wettbewerber - ich] >= N (siehe UI)
				"themMeMinCurrency"	: "USD",  // Währung oder "%" Ihres Preises (NICHT "original")
				"themMeMax"		: -1.5,  // ... <= N
				"themMeMaxCurrency"	: "%",  // Währung (...)
				"addPre"		: -10.00,  // Betrag vor dem Multiplizieren addieren (negativ zum Abziehen)
				"addPreCurrency"	: "USD",  // Währung ("original" = Währung 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",  // Währung (...)
				// Klingt kompliziert? Sehen Sie sich das einfache Beispiel unter der Antwort an.
			},
			... // Maximal 10 Blocke (in Reihenfolge angewendet)
		],
		// HINWEIS: Einzelne Felder/Blöcke lassen sich derzeit nicht ändern. 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 Löschen samtlicher Berechnungen mit clear:1.
		// Mit anderen Worten: Eine Berechnung muss etwas bewirken, um gespeichert zu werden.
		// TIPP: Um Berechnungen einer Domain vorubergehend ohne Löschen zu deaktivieren,
		// verwenden Sie categories: ["Some Empty Existing Category"]
	},
	...
] }
ANTWORT:
{
	...
	"actions" : [
		...
		{
			"a"	: "mathEdit",
			"ok"	: 3,  // Anzahl geänderter 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

Diese Anfragen sind POST, gesendet an https://pricezag.com/api/v3/MYAPIKEY
▶ 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 zurückgab
	"errors"	: 1,  // weil eine Aktion ok<0 zurückgab
	"actionsCount"	: 1,
	"actions" : [
		{
			"a"	: "productGet",
			"ok"	: -1,  // so erkennen Sie 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 nötig
			"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 zurückgab
	"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 zurückgab
	"errors"	: 0,  // weil keine Aktion ok<0 zurückgab
	"actionsCount"	: 1,
	"actions" : [
		{
			"a"			: "categoryCopy",
			"ok"			: 3,  // weil 3 Kategorien geändert wurden: 2 alte gelöscht 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 zurückgab
	"errors"	: 0,  // weil keine Aktion ok<0 zurückgab
	"actionsCount"	: 1,
	"actions" : [
		{
			"a"	: "alertRuleEdit",
			"ok"	: 2  // weil 2 Variablen erfolgreich geändert wurden
		}
	]
}