PriceZag API - Koppel prijsgegevens aan je eigen systemen

Gebruik de JSON API van PriceZag om prijzen en voorraad van concurrenten op te vragen, producten en prijsregels te beheren, rapporten te downloaden en workflows te automatiseren.

Snel aan de slag met curl

Ontwikkelaars zien graag meteen werkende code. Met deze opdrachten maak je een testproduct aan en vraag je daarna de gegevens op. Vervang MYAPIKEY door de API-sleutel van je account (zie API-sleutel).
Maak een testproduct aan:
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"}]}'
(als je deze opdracht nogmaals uitvoert, krijg je een foutmelding omdat het product al bestaat)
Vraag nu de gegevens van dat product op:
curl -X POST 'https://pricezag.com/api/v3/MYAPIKEY' -d '{"actions":[{"a":"productGet","code":"000-SOME-TEST-PRODUCT"}]}' | python -mjson.tool
(verwijder | python -mjson.tool als je dit hulpmiddel om het JSON-antwoord in je terminal leesbaar weer te geven niet hebt geïnstalleerd)

Overzicht

Wat je met de PriceZag API kunt doen

Met de JSON API van PriceZag kunnen je scripts en bedrijfssystemen rechtstreeks werken met de prijzen en voorraad van concurrenten die wij monitoren. Vraag productgegevens op, beheer producten en categorieën, bereken bedragen op basis van prijsregels, stel prijsalerts in en download aangepaste spreadsheets. Je kunt de API gebruiken met elk e-commerceplatform of elke programmeertaal die HTTPS-verzoeken kan verzenden en JSON kan verwerken.

Je kunt ook je favoriete AI-assistent vragen om scripts voor je te schrijven. Geef die de URL van deze documentatie (https://pricezag.com/integrations/api), leg uit wat je wilt automatiseren en vertel welke programmeertaal of welk e-commerceplatform je gebruikt. Houd je API-sleutel geheim en plak deze nooit in een gesprek met AI.

PriceZag verzorgt de monitoring al binnen ons platform; de API is dus optioneel. De API is handig als je je eigen systemen met die gegevens wilt verbinden. Shopify en WooCommerce hebben daarnaast directe integraties.

API-sleutel en toegangsrechten

Open in je PriceZag-account Automation > API. Klik op Reveal the current API key om je huidige sleutel te bekijken of op Change the API key om deze te vervangen. Voor beide handelingen moet je je accountwachtwoord invoeren. Je gebruikersaccount moet de juiste rechten hebben om API-sleutels te bekijken of aan te maken. Als die rechten ontbreken, neem dan contact op met een accountbeheerder.

Houd je API-sleutel geheim. Met deze sleutel kunnen ingrijpende wijzigingen in je account worden aangebracht, waaronder het verwijderen van gegevens. Plaats de sleutel nooit in openbare codeopslagplaatsen, browsercode of AI-gesprekken. Als iemand je helpt een integratie te bouwen, maak dan een PriceZag-gebruiker aan met de juiste rechten en vervang de API-sleutel wanneer dat nodig is.

API-toegang hangt af van je abonnement. Met volledige API-toegang kunnen je scripts alle producten beheren. Zonder volledige toegang kan de API alleen bij de eerste 10 producten, alfanumeriek gesorteerd op referentiecode. Heb je bijvoorbeeld 1.000 producten met codes van SKU0001 tot en met SKU1000, dan kan de API de producten van SKU0001 tot en met SKU0010 opvragen. Tijdens de gratis proefperiode van 14 dagen heb je volledige API-toegang. Je kunt volledige API-toegang ook als optie bij je abonnement inschakelen.

API-activiteitenlogboek en laatste verzoek

De pagina Automation > API in je account toont het tijdstip van het laatste API-verzoek en heeft een knop API Activity Log . Raadpleeg deze gegevens als een script niet werkt. Zo kun je controleren of verzoeken PriceZag hebben bereikt en mislukte aanroepen of onverwachte wijzigingen onderzoeken.

Wijzigingen via de API verschijnen ook in de History of Edits in je account, met als gebruikersnaam API. In de geschiedenis van een product kan bijvoorbeeld Price edited by API staan in plaats van Price edited by JOHN. PriceZag ondersteunt meerdere gebruikers binnen één account, zodat je automatische wijzigingen kunt onderscheiden van handmatige wijzigingen door teamleden.

Verzoek-URL en methoden

Alle API-verzoeken gebruiken dezelfde HTTPS-URL. Verstuur POST-verzoeken naar dit adres en vervang MYAPIKEY door je eigen sleutel:

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

De bewerkingen die je via de API wilt uitvoeren (de "actions") en hun parameters horen in de JSON-body van het verzoek, niet in de URL.
Verstuur in de body van een POST-verzoek één JSON-object met een of meer acties. De URL blijft precies hetzelfde, of je nu een product opvraagt, prijzen bijwerkt of een spreadsheet downloadt.

Kun je geen POST-verzoek verzenden?
Als laatste redmiddel kun je een GET-verzoek gebruiken, met de JSON-body als base64 gecodeerd in de URL-parameter ?data= . URL's hebben een maximale lengte, dus POST heeft sterk de voorkeur.

Hoe acties werken

Wat wij een actie noemen, is een bewerking in je account, zoals productvelden aanpassen, een prijsregel wijzigen of de prijzen van alle concurrenten van een product opvragen.
Onze API en gebruikersinterface (UI) voeren dezelfde functies uit op onze backend. Daarom kun je vrijwel iedere handeling in de gebruikersinterface ook via de API uitvoeren.
Bij een API-verzoek bevat je JSON een array met alle acties die je wilt uitvoeren, met minimaal 1 en maximaal 1.000 acties per verzoek. Je kunt bijvoorbeeld drie producten hernoemen en een nieuwe categorie aanmaken in één verzoek met vier acties. Je kunt ook de gegevens van 1.000 producten tegelijk opvragen met 1.000 acties van het type "productGet".
Acties worden uitgevoerd in de volgorde waarin ze in de array staan. Maak je eerst een prijsregel aan en wijs je vervolgens producten aan die regel toe, dan moeten de acties in die volgorde staan, zodat de regel al bestaat wanneer de producten worden gewijzigd.
Verderop vind je een overzicht van alle beschikbare acties.

Je JSON-verzoekobject

Voor scripts en door AI gegenereerde code: De onderstaande referentievoorbeelden bevatten //-commentaar en ...-plaatsaanduidingen om de velden uit te leggen. Dit zijn illustraties, geen geldige JSON die je ongewijzigd kunt verzenden. Verwijder de opmerkingen en vervang de plaatsaanduidingen voordat je een verzoek verzendt. De twee bovenstaande curl-voorbeelden bevatten wel geldige JSON-bodies.

Alle POST-gegevens samen moeten uit één JSON-object bestaan: {...} met daarin de array van uit te voeren acties.
{
	"stopOnFailure"	: 1,  // (optioneel) Normaal gaat onze backend na een mislukte actie door met de volgende. Stel dit in op 1 om te stoppen.

	// Array met alle acties:
	"actions" : [
		// Actie 1:
		{
			"a"	: "someActionName",  // De naam van de actie staat altijd in het veld "a" van elk actieobject.
			"xx"	: "some parameter this action needs"	// Alle andere velden zijn parameters die de actie nodig heeft.
		},
		// Actie 2:
		{
			"a"	: "anotherActionName",
			"abc"	: "some parameter this action needs",
			"xyz"	: {"x":"some object this action needs", "y":5, "z":6}
		},
		// Actie 3:
		{
			"a"	: "aThirdAction",
			"xyz"	: ["some array this action needs", "..."]
		}
	]
}

Serverantwoord en HTTP-statuscodes

Onze server retourneert text/plain bij fouten in de opmaak van je verzoek of bijvoorbeeld wanneer je account is uitgeschakeld. De tekst bevat dan de foutmelding.
Als je verzoek correct is, krijg je normaal gesproken een JSON -object als antwoord, behalve bij enkele acties die uitdrukkelijk als uitzondering zijn aangegeven (bijvoorbeeld het downloaden van een spreadsheet). Je herkent dit aan de responseheader Content-Type: application/json .
Onze HTTP -statuscode is:
► 200 wanneer alle acties zijn geslaagd (het neutrale resultaat ok=0 telt ook als geslaagd)
► 406 wanneer sommige acties zijn geslaagd en andere zijn mislukt.
► 422 wanneer alle acties zijn mislukt, maar niet om een van de hieronder vermelde redenen.
► 400 wanneer het ontvangen JSON-object niet kon worden gedecodeerd.
► 403 wanneer de authenticatie is mislukt (meestal door een verkeerde API-sleutel).
Je kunt je scripts eenvoudig op deze statuscodes laten reageren. Voor meer details kun je het geretourneerde JSON-object bekijken:
{
	"ok"		: 15,  // Aantal succesvol uitgevoerde acties (actie ok>0).
	"errors"	: 0,  // Aantal acties met een foutmelding (actie ok<0).
	"actionsCount"	: 20,  // Totaal aantal aanvankelijk aangevraagde acties (lengte van de array "actions").
	// LET OP: hieruit blijkt dat 5 acties ok=0 teruggaven (geen fout, maar ook geen wijziging).
	
	// Array met alle aanvankelijk aangevraagde acties (in dezelfde volgorde):
	"actions" : [
		...
		// Antwoordobject voor elke actie:
		{
			"a"	: "someActionName",
			"ok"	: 4,		// Resultaat: >0 = geslaagd, 0 = niets gewijzigd, <0 = fout.
						// 0 kan bijvoorbeeld worden geretourneerd als je een productprijs instelt op de huidige prijs.
						// -1 kan betekenen dat het product niet bestaat.
						// De betekenis van >0 hangt af van de actie; vaak is het het aantal daadwerkelijk gewijzigde velden of onderdelen.
			"error"	: "...",  // Foutmelding als ok < 0.
						// Onze foutmeldingen zijn altijd zeer gedetailleerd. Sla ze op in een logbestand,
						// want daarmee kun je achterhalen wat er misging.
			...	// Overige gegevens die specifiek zijn voor deze actie.
		},
		...
	]
}

Voorbeelden?

Soms wordt alles duidelijker met een voorbeeld. Bekijk meer voorbeelden helemaal onderaan deze pagina.

Verzoeklimieten en planning

Onze firewall beschermt ons (en daarmee ook jou) tegen aanvallen en grote aantallen verzoeken. Als de firewall een host blokkeert, kan het lijken alsof onze website niet bereikbaar is (geen verbinding, geen antwoord, geen ping).
Om te voorkomen dat legitieme verzoeken worden geblokkeerd:
► Gebruik nooit een verkeerde API-sleutel. De firewall staat weinig pogingen met onjuiste sleutels toe (net als bij foutieve wachtwoorden op onze website).
► Bundel meerdere acties in één JSON-object en één verzoek (maximaal 1.000). Wil je bijvoorbeeld 1.000 producten aanmaken, verstuur dan één verzoek in plaats van 1.000.
► Als je echt veel verzoeken moet versturen, wacht dan 500 ms tussen de verzoeken en hergebruik dezelfde HTTPS-verbinding. Voor ieder verzoek een nieuwe verbinding openen is een veelgemaakte fout. Veel verzoeken zijn doorgaans alleen nodig als je honderdduizenden producten tegelijk wilt bijwerken, met 1.000 acties per verzoek.
We hanteren geen vaste limiet voor het aantal verzoeken per seconde. Onze firewall beoordeelt tientallen factoren. Gebruik daarom een redelijk verzoektempo.
 
Geplande verzoeken:
Voeg bij periodieke API-verzoeken een willekeurige wachttijd toe, zodat ze niet altijd precies aan het begin van een minuut worden verstuurd. Veel klanten versturen hun verzoeken op seconde 0. Door ze te spreiden worden ze sneller verwerkt en neemt het risico op time-outs bij een drukke server af.

Alle beschikbare API-acties

Bij elke onderstaande actie vind je de parameters en voorbeelden van verzoeken en antwoorden. Via de navigatie links ga je rechtstreeks naar de gewenste actie.

Producten

ActieDoel
productCreateNieuw product aanmaken
productEditBestaand product bewerken
productCompetitorsURL's van concurrenten bij een product wijzigen (zonder ze allemaal te overschrijven)
productCategoriesCategorieën van een of meer producten wijzigen (zonder ze allemaal te overschrijven)
productRepricingVeel producten aan een prijsregel toewijzen
productDeleteEen of meer producten verwijderen
productGetEen product opvragen (inclusief gegevens van concurrenten)
productGetAllAlle producten opvragen (inclusief hun concurrentgegevens)

Categorieën

ActieDoel
categoryCreateNieuwe categorie aanmaken
categoryEditBestaande categorie bewerken
categoryDeleteEen of meer categorieën verwijderen
categoryCopyProducten van de ene categorie naar de andere kopiëren of verplaatsen
categoryGetEen categorie opvragen
categoryGetAllAlle categorieën opvragen

Alerts

ActieDoel
alertRecipientCreateNieuwe ontvanger voor alerts aanmaken
alertRecipientEditOntvanger en/of bijbehorende alertregels bewerken
alertRecipientDeleteOntvanger voor alerts verwijderen
alertRuleEditBestaande alertregel van een ontvanger bewerken
alertRuleCreate ?Deze actie bestaat niet. Gebruik in plaats daarvan alertRecipientEdit met een "rulesAdd"-array.
alertRuleDelete ?Deze actie bestaat niet. Gebruik in plaats daarvan alertRecipientEdit met een "rulesRemove"-array.
alertGetAllAlle ontvangers van alerts en hun regels opvragen

Prijsregels

ActieDoel
repricingCreateNieuwe regel voor automatische prijsaanpassing aanmaken
repricingEditBestaande prijsregel bewerken
repricingDeleteEen prijsregel verwijderen
repricingGetAllAlle prijsregels opvragen

Spreadsheets

ActieDoel
spreadsheetDownloadEen spreadsheet downloaden
spreadsheetPresetEditEen spreadsheetpreset hernoemen of verwijderen
spreadsheetAutoCreateNieuwe automatische spreadsheetexport aanmaken
spreadsheetAutoEditAutomatische spreadsheetexport bewerken

Concurrenten en meer

ActieDoel
competitorDeleteAllEen concurrent verwijderen uit alle producten of categorieën
mathEditPrijsberekeningen voor het domein van een concurrent instellen of wijzigen

Producten

productCreate - Nieuw product aanmaken

Dit is dezelfde functie die de gebruikersinterface gebruikt op de pagina New Product .
{ "actions" : [
	...
	{
		"a"		: "productCreate",
		"code"		: "UNIQUE-REF-CODE",  // 1 tot maximaal 80 tekens ([a-z\d][a-z\d_-]{0,78}[a-z\d]); hoofdletterongevoelig (wordt omgezet naar hoofdletters).
		"name"		: "The Product Name",  // Minimaal 1 en maximaal 200 tekens.
		"price"		: 1234.90,  // Let op komma's en punten: geen scheidingsteken voor duizendtallen; gebruik een punt als decimaalteken.
		"currency"	: "USD",
		"cost"		: 1234.90,  // (optioneel)
		"costCurrency"	: "USD",  // Verplicht als "cost" is opgegeven.
		"repricingRule"	: "The Rule Name",  // (optioneel) Toegewezen prijsregel (leeg = uitgeschakeld, niet-bestaand = fout).
		"myWebsite"	: "https://...",  // (optioneel) URL of shopify:productId:variantId of woocommerce:productId(:variationId).
		"competitors"	: ["https://...", "https://..."],  // (optioneel)
		"categories"	: ["The Category 1", "The Category 2"],  // (optioneel) Categorieën van dit product (niet-bestaande categorieën worden aangemaakt).
		"comments"	: "Some comments\nAnd another line",  // (optioneel) Maximaal 1.000 UTF-8-tekens.
		"custom_someFieldName1"	: "Value of custom field",		// (optioneel)
		"custom_someFieldName2"	: "Value of other\nCustom\tField",  // (optioneel)
		// Aangepaste velden zijn bedoeld voor intern gebruik. Je kunt ze op allerlei plaatsen gebruiken, bijvoorbeeld als kolommen bij het exporteren van een spreadsheet.
		// Maximaal 20 aangepaste velden per product. De naam mag maximaal 40 letters, cijfers of underscores bevatten (hoofdlettergevoelig, exclusief het voorvoegsel "custom_", dus 47 in totaal).
		// De waarde mag maximaal 500 bytes bevatten (vaak, maar niet altijd, evenveel tekens). Je kunt een getal instellen (custom_varname:123),
		// maar de API retourneert altijd een string (custom_varname:"123"). Zet de waarde zo nodig zelf om.
		// Verwijder een aangepast veld door de waarde op "" te zetten. Dit geldt voor productEdit, niet voor productCreate.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "productCreate",
			"ok"	: 1,
			"code"	: "REF-CODE",  // Definitieve code in de database (speciale tekens in de aangeleverde code kunnen worden omgezet).
		},
		...
	]
}

productEdit - Bestaand product bewerken

Dit is dezelfde functie die de gebruikersinterface gebruikt bij het bewerken van productvelden. De interface verstuurt één veld per keer, terwijl je via de API bijvoorbeeld de naam en de prijs in één aanroep kunt wijzigen.
{ "actions" : [
	...
	{
		"a"		: "productEdit",
		"code"		: "REF-CODE",
		...		// Gebruikt dezelfde parameters als productCreate; allemaal optioneel.
		"newCode"	: "REF-CODE-RENAMED",  // (optioneel)
		"competitors"	: ["https://...", "https://..."],  // Indien opgegeven, worden ALLE bestaande URL's van concurrenten OVERSCHREVEN.
		// Wil je alleen concurrenten aan de bestaande lijst toevoegen of eruit verwijderen, gebruik dan de actie productCompetitors.
		"categories"	: ["The Category 1", "The Category 2"],  // Indien opgegeven, worden alle huidige categorieën OVERSCHREVEN. Gebruik anders productCategories of categoryEdit.
		"custom_someFieldName"	: "New value or empty to delete that custom field",
		// Er zijn maximaal 20 aangepaste velden per product. Verwijder eventueel eerst oude velden door hun waarde op "" te zetten voordat je nieuwe toevoegt.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "productEdit",
			"ok"	: 3,  // Aantal aangebrachte wijzigingen (bijv. eigen prijs + 2 concurrent-URL's = 3).
			"code"	: "REF-CODE",  // Definitieve (nieuwe) code in de database (speciale tekens kunnen worden omgezet).
		},
		...
	]
}

productCompetitors - URL's van concurrenten bij een product wijzigen

Wijzig de URL's van concurrenten bij een product zonder de volledige lijst te overschrijven (anders dan bij de actie productEdit ).
{ "actions" : [
	...
	{
		"a"			: "productCompetitors",
		"code"			: "REF-CODE",
		"competitorsAdd"	: ["https://...", "https://..."],  // (optioneel) Voeg deze URL's toe aan de bestaande concurrenten.
		"competitorsRemove"	: ["https://...", "example.com/a0ff80...5f00", "example.net"],  // (optioneel) Verwijder deze concurrenten. Elk element kan zijn:
		// > De URL (inclusief eventuele toegevoegde hashtagmodifier). Labels zijn optioneel.
		// > De "ref" van de concurrent (geretourneerd door andere acties: het hoofddomein gevolgd door een MD5-hash van 32 tekens).
		// > Het hoofddomein of de volledige hostnaam; alle concurrent-URL's van dit domein worden dan bij het product verwijderd.
		// LET OP: "competitorsAdd" en "competitorsRemove" mogen ook strings zijn in plaats van arrays met één element.
		// Verwijderen gebeurt vóór toevoegen, zodat je een volledig domein kunt verwijderen en daarna een URL van dat domein kunt toevoegen.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"			: "productCompetitors",
			"ok"			: 3,  // Aantal gewijzigde URL's van concurrenten.
			"competitorsAdded"	: 2,  // Aantal aan het product toegevoegde URL's van concurrenten.
			"competitorsRemoved"	: 1,  // Aantal bij het product verwijderde URL's van concurrenten.
			// FOUTEN:
			// > Het toevoegen van een al bestaande URL geeft GEEN fout (ok = 0).
			// > Het verwijderen van een niet-bestaande volledige URL of URL-"ref" geeft WEL een fout (ok = -1).
			// > Het verwijderen van alle URL's van een niet-bestaand domein geeft GEEN fout (ok = 0).
		},
		...
	]
}

productCategories - Categorieën van een of meer producten wijzigen

Wijzig de categorieën van een of meer producten zonder ze allemaal te overschrijven (anders dan bij productEdit).
Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar All Products gaat, een aantal producten selecteert en vervolgens op Selected Products > Edit Categories klikt. Kijk gerust in de gebruikersinterface voor meer uitleg.
Bekijk ook de actie categoryEdit zodat je kunt kiezen wat het beste bij je past.
{ "actions" : [
	...
	{
		"a"			: "productCategories",
		"code"			: "REF-CODE",  // Hoofdletterongevoelige string, OF:
		"code"			: ["REF-CODE-1", "REF-CODE-2"],  // Mag ook een array met meerdere producten zijn (maximaal 100.000).
		"categoriesRemove"	: ["The Category 1", "The Category 2"],  // (optioneel) Verwijder eerst uit deze categorieën.
		"categoriesRemoveAll"	: 1,  // (optioneel) Verwijder eerst uit alle categorieën (net als productEdit).
		"deleteEmptyCategories"	: 1,  // Als een categorie daardoor leeg raakt,
		// omdat producten eruit zijn verwijderd, wordt ze verwijderd.
		"categoriesAdd"		: ["The Category 1", "The Category 2"],  // (optioneel) Voeg daarna toe aan deze categorieën (niet-bestaande categorieën worden aangemaakt).
		"categoriesAddClear"	: 1,  // (optioneel) Maak eerst de categorieën leeg waaraan we producten toevoegen.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "productCategories",
			"ok"	: 3,  // Aantal gewijzigde producten.
		},
		...
	]
}

productRepricing - Veel producten aan een prijsregel toewijzen

Wijs maximaal 100.000 producten toe aan één regel voor automatische prijsaanpassing.
Dit doet hetzelfde als de actie productEdit . Omdat elk verzoek maximaal 1.000 acties kan bevatten, zou je met productEdit voor 50.000 producten maar liefst 50 verzoeken moeten versturen. Dat is veel langzamer.
Als je slechts enkele producten wilt aanpassen, kun je beter de actie productEdit gebruiken.
{ "actions" : [
	...
	{
		"a"			: "productRepricing",
		"repricingRule"		: "The Rule Name",  // Hoofdletterongevoelig; "" (lege maar aanwezige string) betekent geen regel (automatische prijsaanpassing uitschakelen).
		"products"		: ["REF-CODE-1", "REF-CODE-2"],  // Hoofdletterongevoelig (maximaal 100.000).
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"		: "productRepricing",
			"ok"		: 10,  // Aantal gewijzigde producten.
			// Als alle producten de regel al gebruikten, krijg je ok=0.
		},
		...
	]
}

productDelete - Een of meer producten verwijderen

WAARSCHUWING: het product en de bijbehorende URL's van concurrenten worden onmiddellijk en definitief uit je account verwijderd.
Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar All Products gaat, enkele producten selecteert en vervolgens op Selected Products > Delete klikt.
{ "actions" : [
	...
	{
		"a"	: "productDelete",
		"code"	: "REF-CODE",  // Hoofdletterongevoelige string, OF:
		"code"	: ["REF-CODE-1", "REF-CODE-2"],  // Mag ook een array zijn om meerdere producten te verwijderen (maximaal 100.000).
		"deleteEmptyCategories"	: 1,  // Als een categorie daardoor leeg raakt,
		// die door het verwijderen van deze producten zijn leeggeraakt, worden eveneens verwijderd.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "productDelete",
			"ok"	: 2,  // Aantal succesvol verwijderde producten.
		},
		...
	]
}

productGet - Een product opvragen

{ "actions" : [
	...
	{
		"a"			: "productGet",
		"code"			: "REF-CODE",  // Hoofdletterongevoelig.
		"currency"		: "EUR",  // (optioneel) Reken alle bedragen om naar deze valuta in plaats van de valuta van de productprijs.
		"withStats"		: 1,  // (optioneel) Retourneer het object met statistieken.
		"noCompetitors"		: 1,  // (optioneel) Retourneer de array met concurrenten niet (kleiner antwoord).
		"noComments"		: 1,  // (optioneel) Retourneer de opmerkingen niet (...).
		"withScreenshots"	: 1,  // (optioneel) Retourneer bij elke concurrent de URL van de nieuwste screenshot.
		"sickMax"		: 2,  // (optioneel, standaard 1) 0-3: retourneer alleen concurrent-URL's met een foutniveau van maximaal N.
	},
	...
] }
Geeft alle gegevens van een product terug, inclusief de huidige prijzen en voorraad van concurrenten.
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"			: "productGet",
			"ok"			: 1,
			"code"			: "REF-CODE",
			"name"			: "The Product Name",
			"price"			: 1234.90,  // Je eigen prijs, altijd in de oorspronkelijke valuta.
			"currency"		: "USD",  // Oorspronkelijke valuta van "price".
			"convCurrency"		: "EUR",  // Valuta van de omgerekende bedragen (meegegeven "currency" of valuta van de productprijs).
			"priceConv"		: 1234.90,  // Je eigen prijs omgerekend naar "convCurrency", of gelijk aan "price".
			"cost"			: 1234.90,
			"costCurrency"		: "USD",
			"costPriceConv"		: 1234.90,  // Je eigen kostprijs omgerekend naar de valuta "currency" van de prijs.
			"costConv"		: 1234.90,  // Je kostprijs omgerekend naar "convCurrency".
			"margin"		: 10.5,  // Percentage (kan negatief zijn).
			"repricingRule"		: "The Rule Name",  // Deze 3 variabelen voor automatische prijsaanpassing ONTBREKEN wanneer er geen prijsregel is.
			"reprice"		: 1234.90,  // Huidig bedrag voor prijsaanpassing, berekend volgens "repricingRule".
			"repriceCurrency"	: "USD",  // Hetzelfde als "convCurrency", hier alleen voor de duidelijkheid.
			"myWebsite"		: "https://...",
			"created"		: 1234567890,  // Epoch-tijdstip waarop het product is aangemaakt.
			"createdBy"		: "SOMEUSER",  // Gebruikersnaam of "API".
			"edited"		: 1234567890,  // Epoch-tijdstip van de laatste bewerking (indien ooit bewerkt).
			"editedBy"		: "SOMEUSER",  // Gebruikersnaam of "API".
			"comments"		: "Some comments\nAnd another line",
			"commentsLast"		: 1234567890,  // Epoch-tijdstip waarop de opmerkingen voor het laatst zijn bewerkt (indien ooit).
			"commentsLastBy"	: "SOMEUSER",  // Gebruikersnaam of "API".
			"categories"		: ["The Category 1", "The Category 2"],
			"stats"		: {
				// Alleen concurrent-URL's met foutniveau 0 of 1 tellen mee voor de statistieken, ongeacht "sickMax".
				// Alle bedragen zijn in "convCurrency": de meegegeven "currency" of de oorspronkelijke "currency" van het product.
				// WAARSCHUWING: wanneer geen bedrag beschikbaar is (bijv. compIn* terwijl niemand voorraad heeft), is de waarde 0.
				"rank"			: 1.23,  // Je rang op basis van prijs (1 = niemand is goedkoper).
				"rankIn"		: 1.23,  // Je rang onder concurrenten met voorraad.
				"compCount"		: 3,  // Aantal concurrenten met een geldige prijs.
				"compInCount"		: 3,  // Aantal concurrenten met voorraad ...
				"compOutCount"		: 3,  // Aantal concurrenten zonder voorraad ...
				"compAvg"		: 123.56,  // Gemiddelde van alle concurrenten.
				"compAvgVsMe"		: 123.56,  // Verschil (in convCurrency) tussen je prijs en het concurrentengemiddelde (negatief = je bent goedkoper).
				"compInAvg"		: 123.56,  // Gemiddelde van concurrenten met voorraad.
				"compInAvgVsMe"		: 123.56,  // Zoals "compAvgVsMe", maar alleen voor concurrenten met voorraad.
				"compLowest"		: 123.56,  // Goedkoopste concurrent.
				"compLowestVsMe"	: 123.56,  // Zoals "compAvgVsMe", maar dan voor de goedkoopste in plaats van het gemiddelde.
				"compInLowest"		: 123.56,  // Goedkoopste concurrent met voorraad.
				"compInLowestVsMe"	: 123.56,  // Zoals "compInAvgVsMe", maar ...
				"compHighest"		: 123.56,  // Duurste concurrent.
				"compHighestVsMe"	: 123.56,  // Zoals "compAvgVsMe", maar ...
				"compInHighest"		: 123.56,  // Duurste concurrent met voorraad.
				"compInHighestVsMe"	: 123.56,  // Zoals "compInAvgVsMe", maar ...
			},
			"competitors"	: [
				// Array van concurrenten (goedkoopste eerst), waarbij elke concurrent een object is:
				...
				{
					"url"		: "https://...",  // Inclusief eventuele toegevoegde hashtagmodifier.
					"ref"		: "example.com/123abc...def",
					// URL-referentie (hoofddomein gevolgd door een MD5-hash van 32 tekens). Zo herkennen we URL's intern.
					"domain"	: "example.com",  // Hoofddomein van deze concurrent.
					"price"		: 1234.90,  // Laatst gevonden bedrag op de website (na eventuele berekeningen volgens je instellingen).
					"currency"	: "USD",  // Op de website gevonden valuta.
					"priceConv"	: 1234.90,  // Prijs omgerekend naar "convCurrency".
					"stock"		: "5",  // Voorraad (string). "A" = beschikbaar, "2" = 2 op voorraad, "0" = uitverkocht, "" = onbekend.
					"salesWk"	: 123,  // Geschatte verkopen per week (indien beschikbaar; zie het vraagteken op de productpagina voor uitleg).
					"screenshotURL"	: "https://pricezag.com/.../screenshot.png",
					// Bij "withScreenshots": URL van de nieuwste beschikbare screenshot (inloggen niet nodig; deze lange URL is openbaar toegankelijk).
					"confidence"	: 98,
					// Betrouwbaarheidspercentage dat de juiste prijs is herkend (zie uitleg via (?) op de productpagina).
					// Onder 70% (instelbaar) noemen we in het platform "onbetrouwbaar" en tonen we een vraagteken naast de prijs.
					// Dit staat los van het foutniveau. Een URL kan problemen hebben terwijl de laatst gevonden prijs correct was,
					// of de URL is bereikbaar terwijl we niet zeker weten of de juiste prijs op de pagina is herkend.
					"sick"		: 0,  // Foutniveau van de URL, van 0 tot 3.
					// 0: Laatste bezoek gelukt (de pagina was bereikbaar en we vonden een prijs).
					// 1: Laatste bezoek mislukt, maar onlangs nog gelukt (geen probleem; dit komt regelmatig voor).
					// 2: Al meerdere dagen geen geldige prijs gevonden.
					// 3: Al meerdere weken geen geldige prijs gevonden.
					// LET OP: de velden "price" en "priceConv" zijn alleen aanwezig bij foutniveau 0 of 1. Bij niveau 2 en 3 ontbreekt de prijs.
				},
				...
			],
			"custom"	: {
				// Dit zijn je aangepaste velden. Open voor uitleg
				// een productpagina in de gebruikersinterface en klik op (?) naast CUSTOM FIELDS.
				// Als er geen aangepaste velden zijn, ontbreekt het volledige object "custom".
				"variable_1"	: "value 1",  // Waarden zijn altijd strings, ook wanneer ze eigenlijk getallen voorstellen.
				"variable_2"	: "value 2",  // Een lege waarde bestaat niet: daarmee zou de variabele worden verwijderd.
				...
			}
		},
		...
	]
}

productGetAll - Alle producten opvragen

Zorg ervoor dat je time-out instellingen ruim genoeg zijn, want de verwerking kan afhankelijk van het aantal producten en concurrenten even duren.
{ "actions" : [
	...
	{
		"a"			: "productGetAll",
		"currency"		: "EUR",  // (optioneel) Reken alle bedragen om naar deze valuta, in plaats van naar de valuta van elk product afzonderlijk.
		"withStats"		: 1,  // (optioneel) Retourneer het object met statistieken.
		"noCompetitors"		: 1,  // (optioneel) Retourneer de array met concurrenten niet (kleiner antwoord).
		"noComments"		: 1,  // (optioneel) Retourneer de opmerkingen niet (...).
		"withScreenshots"	: 1,  // (optioneel) Retourneer bij elke concurrent de URL van de nieuwste screenshot.
		"sickMax"		: 2,  // (optioneel, standaard 1) 0-3: retourneer alleen concurrent-URL's met een foutniveau van maximaal N.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"		: "productGetAll",
			"ok"		: 10,  // Totaal aantal producten.
			"products"	: [ // Array van producten (alfabetisch gesorteerd op referentiecode), met een object per product:
				...
				{ ... },  // Productobject zoals in het antwoord van de actie productGet hierboven.
				...
			],
		},
		...
	]
}
Misschien is de actie categoryGet ook handig.

Categorieën

categoryCreate - Nieuwe categorie aanmaken

Dit is dezelfde functie die de gebruikersinterface gebruikt op de pagina Categories wanneer je op de knop New Category klikt. Via de API kun je bovendien meteen producten aan de nieuwe categorie toewijzen.
Anders dan andere acties die zowel bestaande als nieuwe categorieën accepteren (zoals productCreate), mislukt deze actie als de categorie al bestaat.
{ "actions" : [
	...
	{
		"a"		: "categoryCreate",
		"name"		: "The New Category Name",
		"name"		: ["New Category 1", "New Category 2"],  // Mag ook een array zijn.
		"products"	: ["REF-CODE-1", "REF-CODE-2"],  // (optioneel) Plaats deze producten tijdens het aanmaken in deze categorieën.
		"comments"	: "Some comments\nAnd another line",  // (optioneel) Maximaal 1.000 UTF-8-tekens.
	},
	...
] }

categoryEdit - Bestaande categorie bewerken

Bekijk ook de actie productCategories zodat je kunt kiezen wat het beste bij je past.
{ "actions" : [
	...
	{
		"a"			: "categoryEdit",
		"name"			: "The Category Name",		// Hoofdletterongevoelig.
		"newName"		: "The Category Renamed",  // (optioneel)
		"products"		: ["REF-CODE-1", "REF-CODE-2"],  // (optioneel) Overschrijf de productlijst.
		"productsAdd"		: ["REF-CODE-1", "REF-CODE-2"],  // (optioneel) Voeg deze producten toe aan de categorie.
		"productsRemove"	: ["REF-CODE-3", "REF-CODE-4"],  // (optioneel) Verwijder deze producten uit de categorie (de producten zelf worden NIET verwijderd).
		"comments"		: "To overwrite the comments.",  // (optioneel) Maximaal 1.000 UTF-8-tekens.
	},
	...
] }
De velden "products", "productsAdd" en "productsRemove" doen allemaal hetzelfde: ze veranderen welke producten bij deze categorie horen, maar op verschillende manieren. Wil je alle producten uit een categorie halen, gebruik dan simpelweg "products" : []
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"			: "categoryEdit",
			"ok"			: 5,  // Aantal aangebrachte wijzigingen.
			// (Hernoemen en opmerkingen bewerken tellen elk als één wijziging; ieder toegevoegd of verwijderd product ook.)
			"name"			: "The Category Name",  // Nieuwe naam na hernoemen, of de oorspronkelijke naam.
			"productsCount"		: 30,  // Nieuw aantal producten in deze categorie (ook als dit niet is gewijzigd).
			"productsAdded"		: 2,  // Aantal aan de categorie toegevoegde producten.
			"productsRemoved"	: 2,  // Aantal uit de categorie verwijderde producten.
		},
		...
	]
}

categoryDelete - Een of meer categorieën verwijderen

Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar Categories gaat, enkele categorieën selecteert en daarna op Selected Categories > Delete klikt.
{ "actions" : [
	...
	{
		"a"			: "categoryDelete",
		"name"			: "The Category Name",  // Hoofdletterongevoelige string, OF:
		"name"			: ["Category 1", "Category 2"],  // Mag ook een array zijn om meerdere categorieën te verwijderen (maximaal 1.000).
		"deleteProducts"	: 1,
		// Standaard wordt alleen de categorie verwijderd; de producten blijven bestaan,
		// maar met deleteProducts worden alle producten in de categorie zonder bevestiging verwijderd,
		// inclusief hun concurrent-URLs, zonder mogelijkheid tot herstel!
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"			: "categoryDelete",
			"ok"			: 2,  // Aantal verwijderde categorieën.
			"productsCount"		: 123,  // Aantal producten in deze categorieën.
			"productsDeleted"	: 123,  // Aantal producten verwijderd door de optie "deleteProducts".
			// LET OP: een product dat in meerdere opgegeven categorieën staat, telt maar één keer mee.
		},
		...
	]
}

categoryCopy - Producten tussen categorieën kopiëren of verplaatsen

Kopieer of verplaats producten uit overeenkomende categorieën naar andere, nieuwe of bestaande categorieën. Hiermee kun je ook categorieën SAMENVOEGEN (zie de voorbeelden onderaan deze pagina).
Geen enkele instelling hier verwijdert producten: ze worden alleen aan categorieën toegevoegd of eruit gehaald.
Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar Categories gaat, enkele categorieën selecteert en daarna op Selected Categories > Copy & More klikt. Kijk gerust in de gebruikersinterface voor meer uitleg.
{ "actions" : [
	...
	{
		"a"			: "categoryCopy",
		"categoriesFrom"	: ["Category 1", "Category 2"],  // Zoek de producten in deze categorieën (de bron).
		"removeMode"		: "cat",  // (optioneel) Verwijder overeenkomende producten uit de opgegeven "categoriesFrom".
		"removeMode"		: "all",  // (optioneel) Verwijder overeenkomende producten uit alle categorieën waarin ze staan.
		// Als "removeMode" ontbreekt, blijven de producten in "categoriesFrom" en worden ze ook aan "categoriesTo" toegevoegd (kopiëren in plaats van verplaatsen).
		"deleteMode"		: "cat",  // (optioneel) Verwijder na het kopiëren van producten de opgegeven "categoriesFrom".
		"deleteMode"		: "all",  // (optioneel) Verwijder alle categorieën waarin deze producten voorkomen.
		// Als "deleteMode" ontbreekt, blijven "categoriesFrom" bestaan, ook nadat de producten met "removeMode" eruit zijn gehaald.
		"categoriesTo"		: ["Another Category 1", "Another Category 2"],
		// Plaats alle overeenkomende producten in deze doelcategorieën (niet-bestaande categorieën worden aangemaakt).
		"categoriesToClear"	: 1,  // (optioneel) Maak eerst de categorieën leeg waaraan we producten toevoegen.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"			: "categoryCopy",
			"ok"			: 3,  // Aantal gewijzigde categorieën (bron en bestemming).
			// "ok" is de som van categoriesModified + categoriesCreated + categoriesDeleted.
			"categoriesModified"	: 2,  // Aantal bestaande gewijzigde categorieën (bron en bestemming).
			"categoriesCreated"	: 1,  // Aantal nieuw aangemaakte categorieën.
			"categoriesDeleted"	: 0,  // Aantal categorieën verwijderd door "deleteMode".
			"productsCount"		: 123,  // Aantal producten dat overeenkomt met de opgegeven "categoriesFrom".
			// LET OP: een product dat in meerdere opgegeven "categoriesFrom" staat, telt maar één keer mee.
		},
		...
	]
}

categoryGet - Een categorie opvragen

{ "actions" : [
	...
	{
		"a"		: "categoryGet",
		"name"		: "The Category Name",  // Hoofdletterongevoelig.
		"currency"	: "EUR",  // (VERPLICHT als withStats of withProducts) Valuta voor de statistieken.
		"withStats"	: 1,  // Retourneer ook de statistieken (langzamer).
		"withProducts"	: 1,  // Retourneer ook de producten van deze categorie (kan veel gegevens opleveren).
		"noCompetitors"	: 1,  // Bij withProducts: retourneer de array met concurrenten niet (kleiner antwoord).
		"noComments"	: 1,  // Bij withProducts: retourneer de productopmerkingen niet (categorieopmerkingen wel).
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"			: "categoryGet",
			"ok"			: 1,
			"name"			: "The Category Name",
			"created"		: 1234567890,  // Epoch-tijdstip.
			"createdBy"		: "SOMEUSER",  // Gebruikersnaam of "API".
			"comments"		: "Comments of this category",
			"commentsLast"		: 1234567890,  // Epoch-tijdstip waarop de opmerkingen voor het laatst zijn bewerkt (indien ooit).
			"commentsLastBy"	: "SOMEUSER",  // Gebruikersnaam of "API".
			"productsCount"		: 10,  // Aantal producten in deze categorie.
			"stats"		: {
				// Dit zijn de statistieken die je in de gebruikersinterface ziet op de categoriepagina en als kolommen in het categorieoverzicht.
				// Voor meer uitleg kun je ze als kolom in de categorielijst weergeven en op (?) klikken.
				// Alle bedragen zijn in de bij het verzoek opgegeven "currency".
				// WAARSCHUWING: wanneer geen bedrag beschikbaar is (bijv. compIn* terwijl niemand voorraad heeft), is de waarde 0.
				"priceAvg"		: 123.45,  // Gemiddelde van je eigen prijzen.
				"costAvg"		: 123.45,  // Alleen producten met een kostprijs tellen mee voor dit gemiddelde.
				"marginAvg"		: 10.5,  // Percentage (kan negatief zijn; alleen producten met een kostprijs tellen mee).
				"rankAvg"		: 1.23,  // Je gemiddelde prijsrang (1 = niemand is goedkoper).
				"rankInAvg"		: 1.23,  // Je gemiddelde rang onder concurrenten met voorraad.
				"productsCountComp"	: 9,  // Aantal producten met een of meer concurrenten.
				"productsCountCompIn"	: 7,  // Aantal producten met een of meer concurrenten met voorraad.
				"compAvg"		: 123.56,  // Gemiddelde van de gemiddelden van alle concurrenten.
				"compAvgVsMe"		: 123.56,  // Gemiddeld verschil (in currency) tussen je prijs en die van concurrenten (negatief = je bent goedkoper).
				"compInAvg"		: 123.56,  // Zoals "compAvg", maar alleen concurrenten met voorraad.
				"compInAvgVsMe"		: 123.56,  // Zoals "compAvgVsMe", maar alleen voor concurrenten met voorraad.
				"compLowest"		: 123.56,  // Zoals "compAvg", maar met de goedkoopste concurrent van elk product als basis.
				"compLowestVsMe"	: 123.56,  // Zoals "compAvgVsMe", maar ...
				"compInLowest"		: 123.56,  // Zoals "compInAvg", maar ...
				"compInLowestVsMe"	: 123.56,  // Zoals "compInAvgVsMe", maar ...
				"compHighest"		: 123.56,  // Zoals "compAvg", maar met de duurste concurrent van elk product als basis.
				"compHighestVsMe"	: 123.56,  // Zoals "compAvgVsMe", maar ...
				"compInHighest"		: 123.56,  // Zoals "compInAvg", maar ...
				"compInHighestVsMe"	: 123.56,  // Zoals "compInAvgVsMe", maar ...
			},
			"products"	: [ // Array van producten (alfabetisch gesorteerd op referentiecode), met een object per product:
				...
				{ ... },  // Productobject zoals in het antwoord van de actie productGet.
				...
			],
		},
		...
	]
}

categoryGetAll - Alle categorieën opvragen

Anders dan categoryGet geeft de actie categoryGetAll geen volledige objecten met productdetails terug. Hetzelfde product kan immers in meerdere categorieën voorkomen, waardoor de gegevens heel omvangrijk en dubbelop zouden worden. Gebruik voor de productgegevens liever categoryGet per categorie, of productGetAll en sorteer de producten daarna op categorie.
{ "actions" : [
	...
	{
		"a"		: "categoryGetAll",
		"withStats"	: 1,  // Retourneer ook de statistieken (langzamer).
		"noComments"	: 1,  // Retourneer de opmerkingen niet (kleiner antwoord).
		"noProducts"	: 1,  // Retourneer de array met producten niet (...).
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"		: "categoryGetAll",
			"ok"		: 10,  // Totaal aantal categorieën (lengte van de array "categories").
			"categories"	: [ // Array van categorieën (alfabetisch gesorteerd), met een object per categorie:
				...
				{
					"name"			: "The Category Name",
					"created"		: 1234567890,  // Epoch-tijdstip.
					"createdBy"		: "SOMEUSER",  // Gebruikersnaam of "API".
					"comments"		: "Comments of this category",
					"commentsLast"		: 1234567890,  // Epoch-tijdstip waarop de opmerkingen voor het laatst zijn bewerkt (indien ooit).
					"commentsLastBy"	: "SOMEUSER",  // Gebruikersnaam of "API".
					"productsCount"		: 2,  // Aantal producten in deze categorie.
					"products"	: ["REF-CODE-1", "REF-CODE-2"],  // Referentiecodes van de producten (alfabetisch gesorteerd), tenzij noProducts=1.
					"stats"		: {
						// Bij "withStats": hetzelfde statistiekenobject als bij categoryGet hierboven.
						...
					},
				}
				...
			],
		},
		...
	]
}

Alerts

alertRecipientCreate - Nieuwe ontvanger voor alerts aanmaken

Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar Alerts gaat en op de knop New Recipient klikt.
Klik in je account op de groene vraagtekens voor uitleg bij elk veld.
{ "actions" : [
	...
	{
		"a"		: "alertRecipientCreate",
		"email"		: "john@example.net",  // Mag ook een telefoonnummer zijn voor sms-alerts; zie de uitleg in de gebruikersinterface.
		"name"		: "john",  // Eenvoudige weergavenaam (meestal de voornaam; hoofdletterongevoelig).
		"maxFrequency"	: 1800,  // (optioneel, standaard 7200) Zie de uitleg in de gebruikersinterface.
		"simplify"	: 0,  // (optioneel, standaard 1) Vereenvoudiging inschakelen (zie gebruikersinterface).
		"sleepEnabled"	: 1,  // (optioneel) Slaapuren inschakelen.
		"sleepFrom"	: "18:30",  // (alleen bij sleepEnabled) 24-uursnotatie.
		"sleepTo"	: "07:00",  // (alleen bij sleepEnabled) 24-uursnotatie.
		"timezone"	: "America/Los_Angeles",  // (alleen bij sleepEnabled) Linux-bestandslocatie onder /usr/share/zoneinfo.
				// Spaties worden omgezet in underscores.
				// Zoek je tijdzone op in het formulier [New Recipient] van de gebruikersinterface, zodat je exact dezelfde naam gebruikt.
		"status"	: "hold",  // (optioneel) Stel de modus "hold" of "disable" in. Iedere andere waarde (zoals "") betekent actief.
		"rules"		: [...],  // (optioneel) Beginregels voor alerts (array met regelobjecten), zoals "rulesAdd" bij alertRecipientEdit hieronder.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "alertRecipientCreate",
			"ok"	: 1,
		},
		...
	]
}

alertRecipientEdit - Ontvanger en/of alertregels bewerken

Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar Alerts gaat en op de knop Settings of op de knop Rules van een ontvanger klikt.
Klik in je account op de groene vraagtekens voor uitleg bij elk veld.
De pagina "email" bepaalt welke ontvanger wordt bijgewerkt. De overige velden wijzigen de instellingen van die ontvanger.
{ "actions" : [
	...
	{
		"a"		: "alertRecipientEdit",
		"email"		: "john@example.net",  // Huidig e-mailadres of telefoonnummer (exact hetzelfde formaat als bij alertGetAll).
		"newEmail"	: "john2@example.net",  // (optioneel) Nieuw e-mailadres of telefoonnummer; zie uitleg in de gebruikersinterface.
		"name"		: "john2",  // (optioneel) Nieuwe naam.
		"maxFrequency"	: 1800,  // (optioneel) Zie de uitleg in de gebruikersinterface.
		"simplify"	: 1,  // (optioneel) Vereenvoudiging inschakelen (zie gebruikersinterface).
		"sleepEnabled"	: 1,  // (optioneel) Slaapuren inschakelen.
		"sleepFrom"	: "18:30",  // (alleen bij sleepEnabled) 24-uursnotatie.
		"sleepTo"	: "07:00",  // (alleen bij sleepEnabled) 24-uursnotatie.
		"timezone"	: "America/Los_Angeles",  // (alleen bij sleepEnabled) Zie alertRecipientCreate hierboven.
		"status"	: "hold",  // (optioneel) Stel de modus "hold" of "disable" in. Iedere andere waarde (zoals "") wordt "active".
		"rules"		: [{ruleObject}, {ruleObject}],  // (optioneel) Overschrijf alle bestaande regels (lege array verwijdert alle regels).
				  // Geef geen array "rules" op als je bestaande regels wilt behouden.
		"rulesAdd"	: [ // (optioneel) Voeg deze regels toe aan de bestaande regels.
			...
			{  // DIT IS HET FORMAAT VAN EEN REGELOBJECT:
				"name"		: "me_cross_avg",  // Zie de pagina Alerts > [Rules] > [+ New Rule]; selecteer een regel om de API-naam te zien.
				"disabled"	: 1,  // (optioneel) Het is niet logisch een uitgeschakelde regel aan te maken, maar alertRuleEdit hieronder kan dat veld wel gebruiken.
				"var_n"		: 123.00,  // Een variabele "X" wordt "var_x",
				"var_c"		: "USD",  // ... vul hier dus de parameters in die de regel nodig heeft,
				"var_h"		: 24,  // ... sommige regels hebben geen variabelen.
				"direction"	: "both",  // Of "drop" of "rise" als de regel een richting heeft.
				"categories"	: ["The Category 1", "The Category 2"],  // (optioneel) Leeg of weggelaten betekent ALLE PRODUCTEN.
				"ignoreOos"	: 1,  // (optioneel) Negeer concurrenten zonder voorraad (zie gebruikersinterface).
				"urlInclude"	: "",  // (optioneel, hoofdletterongevoelig).
				"urlExclude"	: "amazon",  // (optioneel, hoofdletterongevoelig).
				// "ruleNumber" identificeert iedere regel (bijv. voor later wijzigen of verwijderen).
				// Bij het opvragen van regels zie je deze waarde, maar je kunt haar niet zelf instellen.
			}
			...
		],
		"rulesRemove"	: [1,4,7],  // (optioneel) De "ruleNumber"-waarden van de te verwijderen regels.
					// Deze "ruleNumber" krijg je via alertGetAll hieronder.
					// LET OP: om alle regels te verwijderen kun je ook "rules" = [] gebruiken.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "alertRecipientEdit",
			"ok"	: 3,  // Aantal wijzigingen (variabelen + aantal toegevoegde of verwijderde regels).
		},
		...
	]
}

alertRecipientDelete - Ontvanger voor alerts verwijderen

Dit is definitief. Alle alertregels en de geschiedenis van deze ontvanger worden meteen verwijderd en kunnen niet worden hersteld.
{ "actions" : [
	...
	{
		"a"		: "alertRecipientDelete",
		"email"		: "john@example.net",  // Huidig e-mailadres of telefoonnummer (exact hetzelfde formaat als bij alertGetAll).
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "alertRecipientDelete",
			"ok"	: 1,
		},
		...
	]
}

alertRuleEdit - Bestaande alertregel van een ontvanger bewerken

Hiermee pas je één bestaande alertregel aan zonder andere regels te vervangen of toe te voegen. Je kunt bijvoorbeeld de variabele N wijzigen of een regel in- of uitschakelen.
Gebruik om een regel te verwijderen de array "rulesRemove" van de actie alertRecipientEdit , en om een nieuwe toe te voegen de array "rulesAdd" van dezelfde actie.
{ "actions" : [
	...
	{
		"a"		: "alertRuleEdit",
		"email"		: "john@example.net",  // E-mailadres of telefoonnummer van de ontvanger (exact als bij alertGetAll).
		"ruleNumber"	: 1,  // Referentienummer van de te wijzigen regel, zoals geretourneerd door alertGetAll.
		"rule"		: {
			// Te overschrijven regelvariabelen; zie "rulesAdd" bij alertRecipientEdit hierboven voor het FORMAAT VAN EEN REGELOBJECT.
			"disabled"	: 1,  // Bijvoorbeeld om een regel in of uit te schakelen.
			"var_n"		: 5,  // Of een andere variabele, bijvoorbeeld N, afhankelijk van het type regel.
			...
		},
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "alertRuleEdit",
			"ok"	: 1,  // Aantal gewijzigde variabelen.
		},
		...
	]
}

alertGetAll - Alle ontvangers en alertregels opvragen

{ "actions" : [
	...
	{
		"a"	: "alertGetAll",
		// Deze actie heeft geen parameters.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"		: "alertGetAll",
			"ok"		: 3,  // Aantal ontvangers (de lengte van de array "recipients").
			"recipients"	: [ // Array van alle ontvangers, elk als object zoals in alertRecipientCreate hierboven.
				...
				{
					"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 van regels, elk als object zoals beschreven bij alertRecipientEdit hierboven.
						...
						{
							"ruleNumber"	: 4,  // Referentienummer voor het bewerken van deze regel via alertRuleEdit hierboven.
							"name"		: "me_cross_avg",
							"disabled"	: 0,
							"var_n"		: "123.00",  // LET OP: we retourneren alle variabelen als strings, ook als het getallen zijn.
							"var_c"		: "USD",
							"var_h"		: "24",
							"direction"	: "both",
							"categories"	: [],  // Leeg betekent alle producten.
							"ignoreOos"	: 0,
							"urlInclude"	: "",
							"urlExclude"	: "amazon",
						}
						...
					],
				}
				...
			],
		},
		...
	]
}

Prijsregels

repricingCreate - Nieuwe prijsregel aanmaken

Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar Repricing en op de knop New Repricing Rule klikt.
Klik in je account op de groene vraagtekens voor uitleg bij elk veld.
Maar hoe wijs je producten toe aan de regel? Door de producten zelf te bewerken met de actie productEdit of productRepricing . Een regel heeft niet echt producten; het zijn de producten die via een verwijzing aan een specifieke regel zijn gekoppeld.
{ "actions" : [
	...
	{
		"a"	: "repricingCreate",
		"name"	: "The Rule Name",  // Maximaal 50 tekens.
		"init"	: { // Object met de basisinstelling (de eerste regel, "Set my price to").
			"target"	: "cheapest_n",  // (zie onderstaande lijst)
			"var_n"		: 3,  // Alleen als "target" een variabele N vereist.
			"plusAmount"	: -2,  // Positief voor erboven, negatief voor eronder.
			"plusCurrency"	: "%",  // Valuta (bijv. "USD") of "%".
			// Dit betekent: "Stel mijn prijs 2% onder het gemiddelde van de 3 goedkoopste concurrenten in".
			// WAARSCHUWING: anders dan bij de onderstaande "never"-objecten heeft de basisinstelling geen "direction". Het teken van "plusAmount" bepaalt erboven of eronder.
		},
		"never"	: [ // (optioneel) Objecten voor "maar nooit", uitgevoerd in volgorde (maximaal 0 tot 10).
			{
				"target"	: "cheapest_n_in",  // (zie onderstaande lijst)
				"var_n"		: 1,  // Alleen als "target" een variabele N vereist.
				"direction"	: "below",  // Of "above".
				"plusAmount"	: -10,  // Positief voor optellen, negatief voor aftrekken (verplicht, ook bij 0).
				"plusCurrency"	: "USD",  // Valuta of "%" (verplicht, ook als plusAmount=0).
				// Dit betekent: "Maar nooit onder de goedkoopste concurrent met voorraad, min 10,00 USD".
			},
			{
				"target"	: "cost",
				"direction"	: "below",
				"plusAmount"	: 5,
				"plusCurrency"	: "%",
				// Dit betekent: "Maar nooit onder mijn kostprijs plus 5%".
			}
		],
		"ignoreDomains"	: "amazon ebay.com MyLabel1",  // (optioneel) Domeinen en/of labels van concurrenten die moeten worden genegeerd (hoofdletterongevoelig; zie gebruikersinterface).
		"charm"		: "none|zeros|charm",  // (optioneel, standaard "none") Psychologische prijzen ("", "none" en weglaten betekenen hetzelfde).
		"confidence"	: 82,  // (optioneel, standaard 70) Minimaal betrouwbaarheidspercentage 0-99 (zie gebruikersinterface).
		"disabled"	: 1,  // (optioneel)
	},
	...
] }
// ========== Alle mogelijke "target"-strings: ==========
// "average" : Gemiddelde van alle concurrenten.
// "average_in" : Gemiddelde van alle concurrenten met voorraad.
// "cheapest_n" : Gemiddelde van de N goedkoopste concurrenten (of "De goedkoopste" als N=1).
// "cheapest_n_in" : Gemiddelde van de N goedkoopste concurrenten met voorraad (of ...).
// "highest_n" : Gemiddelde van de N duurste concurrenten (of ...).
// "highest_n_in" : Gemiddelde van de N duurste concurrenten met voorraad (of ...).
// "cost" : Mijn kostprijs.
// "me_avg_n" : Mijn gemiddelde prijs in de afgelopen N uur (om de snelheid van prijswijzigingen te beperken).
// "domain:example.com" : Prijs van example.com (laagste prijs als meerdere URL's hetzelfde domein hebben).
// "domainIn:example.com" : Prijs van example.com, alleen als er voorraad is (...).
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "repricingCreate",
			"ok"	: 3,  // Aantal succesvol verwerkte en opgeslagen objecten (bijv. init + never[0] + never[1] = 3).
			"name"	: "The Rule Name",  // Definitieve naam in de database (speciale tekens kunnen worden omgezet).
		},
		...
	]
}

repricingEdit - Bestaande prijsregel bewerken

Wijzig een bestaande regel voor automatische prijsaanpassing.
Zie repricingCreate hierboven voor een uitleg van deze variabelen.
Hiermee wijzig je alleen de regel zelf, niet de producten die eraan zijn gekoppeld. Gebruik de actie productEdit of productRepricing gebruiken.
{ "actions" : [
	...
	{
		"a"		: "repricingEdit",
		"name"		: "The Rule Name",  // Hoofdletterongevoelig.
		"newName"	: "The Rule Renamed",  // (optioneel) Maximaal 50 tekens.
		"init"		: { // (optioneel) Indien opgegeven, overschrijf een of meer variabelen van de basisinstelling (zie repricingCreate).
			"plusAmount"	: 1,  // Je kunt bijvoorbeeld alleen "plusAmount" overschrijven en de andere variabelen behouden.
			// WAARSCHUWING: als de nieuwe "target" een variabele N nodig heeft, moet je "var_n" meegeven.
		},
		"never"		: [...], // (optioneel) Je kunt de hele array "never" overschrijven, maar doorgaans gebruik je beter never_*.
		// "never":[] verwijdert dus alle bestaande voorwaarden. Laat deze variabele weg om ze te behouden.
		"never_0"	: { // (optioneel) Overschrijf het eerste object "maar nooit" (array-index 0).
			"var_n"		: 2,  // Je kunt bijvoorbeeld alleen "var_n" wijzigen en de andere variabelen behouden.
		},
		"never_2"	: {
			"target"	: "",  // Hiermee schakel je de derde voorwaarde "maar nooit" uit (array-index 2).
			// Als "target" op "" staat, hoef je de andere variabelen van dat object niet in te vullen.
			// "never_2":{} doet hetzelfde.
		},
		"never_6"	: {...}, // Dit kan een nieuwe voorwaarde "maar nooit" zijn; dan zijn alle variabelen verplicht, net als bij repricingCreate.
		// "never_9" is het maximum: de array "never" kan maximaal 10 elementen bevatten.
		"ignoreDomains"	: "",  // (optioneel) Hetzelfde als bij repricingCreate.
		"charm"		: "zeros",  // (optioneel) ...
		"confidence"	: 82,  // (optioneel) ...
		"disabled"	: 1,  // (optioneel) 0 om een momenteel uitgeschakelde regel weer in te schakelen.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "repricingEdit",
			"ok"	: 3,  // Aantal wijzigingen (bijv. één variabele van een never_N-object + één van "init" + "charm").
			"name"	: "The Rule Name",  // Definitieve (nieuwe) naam in de database (speciale tekens kunnen worden omgezet).
		},
		...
	]
}

repricingDelete - Een prijsregel verwijderen

Dit is definitief. De prijsregel wordt onmiddellijk en definitief uit je account verwijderd. Producten die deze regel gebruiken, hebben daarna geen prijsregel meer, waardoor hun automatische prijsaanpassing mislukt.
{ "actions" : [
	...
	{
		"a"		: "repricingDelete",
		"name"		: "The Rule Name",  // Hoofdletterongevoelig.
		"onlyIfUnused"	: 1,  // (optioneel) Voor de zekerheid kun je hiermee een fout laten geven als een of meer producten de regel gebruiken.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"		: "repricingDelete",
			"ok"		: 1,
			"productsCount"	: 10,  // Aantal producten dat deze regel gebruikte (en nu geen regel meer heeft).
		},
		...
	]
}

repricingGetAll - Alle prijsregels opvragen

Bekijk eerst repricingCreate hierboven. De gegevens die deze actie teruggeeft, hebben namelijk veel gemeen met het formaat dat je aan repricingCreate meegeeft.
{ "actions" : [
	...
	{
		"a"	: "repricingGetAll",
		// Deze actie heeft geen andere parameters.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "repricingGetAll",
			"ok"	: 10,  // Totaal aantal regels (lengte van de array "rules").
			"rules"	: [ // Array van prijsregels (alfabetisch gesorteerd), elk als object:
				...
				{
					"name"		: "Some Repricing Rule",
					"created"	: 1234567890,  // Epoch-tijdstip waarop de regel voor het eerst is aangemaakt.
					"createdBy"	: "SOMEUSER",  // Gebruikersnaam of "API".
					"edited"	: 1234567890,  // Tijdstip van laatste bewerking (als die er is; anders ontbreekt het veld).
					"editedBy"	: "SOMEUSER",  // Gebruikersnaam of "API" (kan ook ontbreken).
					"disabled"	: 1234567890,  // Als de regel momenteel is uitgeschakeld: Epoch-tijdstip van laatste uitschakeling. Anders ontbreekt dit veld.
					"disabledBy"	: "SOMEUSER",  // Gebruikersnaam of "API" (kan ook ontbreken).
					"productsCount"	: 10,  // Aantal producten dat deze regel momenteel gebruikt.
					"ignoreDomains"	: "amazon ebay.com MyLabel1",  // Genegeerde domeinen en/of labels van concurrenten (zie gebruikersinterface).
					"charm"		: "charm",  // Modus voor psychologische prijzen (none|zeros|charm).
					"confidence"	: 82,  // Minimaal betrouwbaarheidspercentage 0-99 (zie gebruikersinterface).
					"init"	: { // Object met de basisinstelling (de eerste regel, "Set my price to").
						"target"	: "cheapest_n",  // (zie lijst bij repricingCreate)
						"var_n"		: 3,  // Als de "target" een variabele N vereist; anders ontbreekt dit veld.
						"plusAmount"	: -2,  // Positief voor erboven, negatief voor eronder.
						"plusCurrency"	: "%",  // Valuta (bijv. "USD") of "%".
						// Dit betekent: "Stel mijn prijs 2% onder het gemiddelde van de 3 goedkoopste concurrenten in".
						// WAARSCHUWING: anders dan bij de onderstaande "never"-objecten heeft de basisinstelling geen "direction". Het teken van "plusAmount" bepaalt erboven of eronder.
					},
					"never"	: [ // Objecten voor "maar nooit", uitgevoerd in volgorde.
						{
							"target"	: "cheapest_n_in",
							"var_n"		: 1,
							"direction"	: "below",  // Of "above".
							"plusAmount"	: -10,  // Positief voor optellen, negatief voor aftrekken.
							"plusCurrency"	: "USD",  // Valuta of "%".
							// Dit betekent: "Maar nooit onder de goedkoopste concurrent met voorraad, min 10,00 USD".
						},
						{},  // Dit betekent dat je de tweede regel van de voorwaarden "Maar nooit" leeg hebt gelaten.
						{
							"target"	: "cost",
							"direction"	: "below",
							"plusAmount"	: 5,
							"plusCurrency"	: "%",
							// Dit betekent: "Maar nooit onder mijn kostprijs plus 5%".
						}
					],
				}
				...
			],
		},
		...
	]
}

Spreadsheets

spreadsheetDownload - Een spreadsheet downloaden

Deze actie is een UITZONDERING: je kunt haar niet met andere acties combineren en ze retourneert een spreadsheetbestand in plaats van een JSON-antwoordobject. (tenzij je "savePreset" of "downloadURL" gebruikt, zoals hieronder beschreven)
Dit komt overeen met wat je op de pagina Export in je account kunt doen.
Zorg ervoor dat je time-out instellingen ruim genoeg zijn, want het maken van een grote spreadsheet kan even duren.
MAAK HET JEZELF MAKKELIJK: Je kunt op de knop Show API equivalent klikken op de pagina Export om automatisch de volledige JSON-aanroep (en curl-opdracht) te genereren voor de gekozen formulieropties.
{ "actions" : [
	{
		"a"		: "spreadsheetDownload",
		"preset"	: "Some Preset Name",  // (optioneel) In plaats van alle onderstaande parameters kun je een eigen of een standaardpreset van ons gebruiken.
			// Gebruik voor je eigen presets de volledige naam, zonder gebruikersnaam ervoor of valuta erachter.
			// De namen van onze standaardpresets vind je in het keuzemenu DIRECT DOWNLOAD op de exportpagina; beweeg de muis erover.
			// "pricezag_backup" is bijvoorbeeld onze speciale back-uppreset (zie "Special BACKUP format to re-import" onder DIRECT DOWNLOAD).
			// Je kunt ook onderstaande variabelen meegeven om instellingen uit de preset te overschrijven, bijvoorbeeld valuta, formaat of categorieën.
		"savePreset"	: "My New Preset Name",  // (optioneel) Sla de onderstaande instellingen op als nieuwe preset (die je daarna in zowel UI als API kunt gebruiken).
			// UITZONDERING OP DE UITZONDERING: met savePreset wordt geen spreadsheet gedownload; je krijgt zoals gewoonlijk een JSON-object terug.
		"savePresetOverwrite"	: 1,  // (optioneel) Overschrijf de bestaande preset met de naam uit "savePreset" (anders ontstaat een fout).
			// WAARSCHUWING: overschrijven betekent dat NIETS van de vorige preset behouden blijft. Je kunt hiermee niet slechts één veld wijzigen.
			// Gebruik spreadsheetPresetEdit hieronder om een preset te hernoemen of verwijderen.
		"downloadURL"	: 1,  // (optioneel) UITZONDERING OP DE UITZONDERING: in plaats van het spreadsheetbestand krijg je een JSON-antwoord met "fileURL" in het object,
			// een openbare URL naar het bestand (geen authenticatie of API-sleutel vereist). Het bestand kan 15 minuten lang door iedereen worden gedownload.
			// De waarde van "ok" is het aantal rijen; "fileSize" geeft de bestandsgrootte in bytes aan.
		"format"	: "xlsx|xls|csv|csv-tab",  // (standaard csv voor de API)
		"currency"	: "USD",  // (VERPLICHT tenzij preset) Valuta waarin ALLE bedragen worden weergegeven.
		"categories"	: ["Category 1", "Category 2"],  // Toon alleen producten uit deze categorieën (anders alle producten).
		"historyPeriod"	: "prev_6mo",  // (optioneel, standaard "now")
			// Klik EERST op de vraagtekens (?) bij de geschiedenisperioden op onze exportpagina. Daar vind je een volledige uitleg.
			// "historyPeriod" bepaalt hoe ver terug in de tijd we bedragen opvragen, voordat we ze volgens "historyRow" als meerdere rijen per product exporteren.
			// "now": geen geschiedenis; alleen huidige gegevens (dus geen "historyRow").
			// "all": de volledige periode sinds je aanmelding (of sinds de betrokken producten worden gevolgd). KAN LANG DUREN.
			// "1234500000-1237800000": aangepaste periode (van-tot in Epoch-tijdstippen).
			// "123h": afgelopen 123 uur. Niet afgerond: einde is nu en het begin kan midden in een klokuur vallen.
			// "cur_123(d|wk|mo|yr)": de laatste 123 dagen/weken/maanden/jaren, inclusief de huidige onvolledige periode. "cur_2mo" op de 10e beslaat dus 40 dagen.
			// "prev_123(d|wk|mo|yr)": de vorige 123 volledig afgeronde dagen/weken/maanden/jaren. "prev_2mo" op 10 februari beslaat bijvoorbeeld alle 62 dagen van december en januari.
			// Het begin van cur_* en prev_* (en het einde van prev_*) wordt altijd afgerond op de vorige middernacht. Het einde van cur_* is het huidige tijdstip,
			// dus "cur_2d" gedownload om 12:00 beslaat de laatste 36 uur; "prev_2d" beslaat 48 uur tot 12 uur geleden.
		"historyRow"	: "2w",  // (verplicht, maar alleen als "historyPeriod" niet "now" is)
			// "historyRow" bepaalt hoeveel tijd één rij vertegenwoordigt (het gemiddelde over die periode); dit levert meerdere rijen per product op (tenzij "all").
			// Je kunt "historyRow" zien als het OPSPLITSEN van "historyPeriod" in afzonderlijke spreadsheetrijen per product.
			// "all": gemiddelde over de volledige historyPeriod als één rij per product.
			// "123(d|wk|mo|qt|yr)": afgerond op middernacht, in perioden van 123 kalenderdagen/-weken/-maanden/-kwartalen/-jaren. Bij 1 mag je het getal weglaten: "wk" in plaats van "1wk".
			// Als je op zaterdag downloadt met historyRow:"7d", bevat elke rij gemiddelde bedragen van een periode van zaterdag 00:00 tot vrijdag 23:59.
			// Gebruik je historyRow:"1wk", dan loopt elke rij van maandag 00:00 tot zondag 23:59. De nieuwste rij bevat de huidige onvolledige week (maandag-zaterdag).
			// ▶ LIMIET VAN 500.000 RIJEN: zowel de UI als de API weigert geschiedenisinstellingen die meer dan 500.000 rijen opleveren.
			// Dit kan snel gebeuren bij historyRow:"day" en een lange historyPeriod, bijvoorbeeld 365 dagen x 1.400 producten.
			// Download in dat geval per categorie een spreadsheet met enkele honderden producten.
		"timezone"	: "America/Los_Angeles",  // (optioneel, standaard "UTC") Linux-bestandslocatie onder /usr/share/zoneinfo.
			// Spaties worden omgezet in underscores.
			// Een tijdzone is alleen nodig als je geschiedenisopties kalenderperioden gebruiken (om middernacht te bepalen).
			// De UI neemt de tijdzone uit de instellingen van de ingelogde gebruiker. De API heeft die instelling niet en vereist dus dat je haar in het verzoek meestuurt.
		// ========== KOLOMMEN: ==========
		// Met column*-variabelen bepaal je welke kolommen de spreadsheet bevat (zie het formulier op de exportpagina voor uitleg bij de afzonderlijke opties).
		// Standaard staan alle kolommen uit (0), behalve Code.
		"columnCode"		: 1,  // (Deze kolom kun je niet verwijderen; iedere rij bevat altijd de product-REF-CODE.)
		"columnName"		: 1,  // Productnaam.
		"columnCategories"	: 1,  // Categorieën waar het product momenteel in staat ("Category 1; Category 2" in één cel).
		"columnComments"	: 1,  // Productopmerkingen.
		"columnCreated"		: 1,  // Aanmaakdatum van product YYYY/MM/DD (in ons systeem).
		"columnCustom"		: 1,  // Aangepaste productvelden (één kolom per unieke variabele van alle producten).
		"columnPrice"		: 1,  // Productprijs in de aangevraagde valuta (NIET in de eigen valuta van het product).
		"columnCost"		: 1,  // Productkostprijs (in ...).
		"columnMargin"		: 1,  // Margepercentage van het product op basis van prijs en kostprijs.
		"columnRank"		: 1,  // Mijn prijsrang.
		"columnInRank"		: 1,  // Mijn rang onder concurrenten met voorraad.
		"columnMyWebsite"	: 1,  // URL van mijn website.
		"columnReprice"		: 1,  // Bedrag voor prijsaanpassing (in ...).
		"columnRepricingRule"	: 1,  // Naam van de prijsregel.
		"columnRecommended"	: 1,  // Aanbevolen prijs (zie uitleg op de exportpagina).
		"columnCompUrls"	: 1,  // URL's van concurrenten (één per kolom).
		"columnCompUrlsJoin"	: 1,  // URL's van concurrenten (gescheiden door spaties in één cel).
		"columnCompMinMaxAvg"	: 1,  // Voegt 3 kolommen toe: minimum/maximum/gemiddelde van concurrenten.
		"columnInCompMinMaxAvg"	: 1,  // Voegt 3 kolommen toe: minimum/maximum/gemiddelde van concurrenten MET VOORRAAD.
		"columnCompPrice"	: 1,  // Voegt per concurrent 1 kolom toe met de prijs (in ...).
		"columnCompStock"	: 1,  // Voegt per concurrent 1 kolom toe met de voorraad (123|IN|OUT).
		"columnCompSales"	: 1,  // Voegt per concurrent 1 kolom toe met de verkoop per week.
		"columnCompRank"	: 1,  // Voegt per concurrent 1 kolom toe met de rang tussen alle concurrenten (inclusief jou).
		"columnCompInRank"	: 1,  // Voegt per concurrent 1 kolom toe met de rang tussen concurrenten MET VOORRAAD (inclusief jou).
		// ========== GEAVANCEERDE, NIET-GEDOCUMENTEERDE PARAMETERS: ==========
		// Er zijn ook enkele onofficiële opties die we nauwelijks documenteren. Sommige worden gebruikt door onze preset "pricezag_backup".
		"originalCurrencies"	: 1,  // In plaats van alle bedragen om te rekenen naar de opgegeven valuta (zodat cellen getallen zijn), bevatten de cellen tekst met de oorspronkelijke valuta ("123.90 USD").
		"keepUrlLabels"		: 1,  // Normaal verwijderen we labels van concurrent-URL's. Met deze optie blijven ze behouden (handig voor back-ups).
		"csvSeparator"		: ";",  // Gebruik een ander scheidingsteken dan komma of tab voor CSV.
		"csvNoQuote"		: 1,  // Voorkom dat CSV ooit aanhalingstekens (") gebruikt. Hierdoor kan het bestandsformaat ongeldig worden.
	}
] }
// Een eenvoudige manier om een CSV-back-up te downloaden is bijvoorbeeld:
// 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 - Een spreadsheetpreset hernoemen of verwijderen

Dit komt overeen met de functie in je account: ga naar de pagina Export en klik op Edit Presets.
Hiermee kun je een preset alleen HERNOEMEN of VERWIJDEREN. Een nieuwe preset maken of een bestaande aanpassen doe je met de actie spreadsheetDownload hierboven.
{ "actions" : [
	{
		"a"		: "spreadsheetPresetEdit",
		"preset"	: "Some Preset Name",  // Huidige naam van de preset.
		"newName"	: "The Renamed Preset",  // Om deze preset te hernoemen.
		"delete"	: 1,  // Verwijdert deze "preset" uit je account.
		// LET OP: je kunt een preset die voor automatische export wordt gebruikt niet verwijderen (dat geeft een fout).
		// Verwijder eerst de geplande automatische exports (zie exportpagina).
	}
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "spreadsheetPresetEdit",
			"ok"	: 1,
		},
		...
	]
}

spreadsheetAutoCreate - Nieuwe automatische spreadsheetexport aanmaken

Dit komt overeen met de functie in je account: ga naar de pagina Export en klik op Add a new Auto-Export.
{ "actions" : [
	{
		"a"			: "spreadsheetAutoCreate",
		"preset"		: "The Preset Name",
		"email"			: "john@example.net",
		"currency"		: "USD",  // (optioneel) Standaard "preset": gebruik de valuta van de preset.
		"attach"		: "link",  // (optioneel, standaard "attach") "attach" = bijlage, "link" = directe gehoste downloadlink.
		"everyMonday"		: 1,  // Verstuur de spreadsheet iedere maandag.
		"everyTuesday"		: 1,  // ... (enzovoort voor iedere weekdag tot "everySunday").
		"everyMonthDay1"	: 15,  // Verstuur iedere 15e van de maand.
		"everyMonthDay2"	: 21,  // ... en ook iedere 21e.
		"everyMonthDay3"	: "last",  // ... en ook op de laatste dag van de maand.
			// everyMonthDay* kan van 0 tot 9 lopen, dus maximaal 10 dagen per maand.
		"time"			: "3:59pm",  // "15.59" werkt ook en wordt omgezet naar "3:59pm". "0:9", "0.09", "00:09" en "0:09am" werken hetzelfde.
		"timezone"		: "America/Los_Angeles",  // (optioneel, standaard "UTC") Linux-bestandslocatie onder /usr/share/zoneinfo.
			// Spaties in de stadnaam worden vervangen door underscores.
	}
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "spreadsheetAutoCreate",
			"ok"	: 1,
			"id"	: "5gwi6fqa",  // Referentie-ID van deze automatische export om hem later te kunnen bewerken (zie spreadsheetAutoEdit hieronder).
		},
		...
	]
}

spreadsheetAutoEdit - Automatische spreadsheetexport bewerken

Dit komt overeen met de functie in je account: ga naar de pagina Export en klik op een van de knoppen Edit in de lijst onder AUTO-EXPORT TO EMAIL.
{ "actions" : [
	{
		"a"			: "spreadsheetAutoEdit",
		"id"			: "5gwi6fqa",  // Referentie-ID van de te bewerken automatische export.
			// Je krijgt deze ID in het antwoord van spreadsheetAutoCreate; in de UI staat hij ook in de titel van het pop-upvenster dat opent via de knop Edit van een automatische export.
		"disabled"		: 1,  // (optioneel) 0 om een uitgeschakelde automatische export weer in te schakelen.
		"delete"		: 1,  // (optioneel) Verwijder deze automatische export volledig.
		// ===== Alle volgende velden zijn optioneel en werken hetzelfde als bij spreadsheetAutoCreate hierboven. =====
		"preset"		: "The Preset Name",
		"email"			: "john@example.net",
		"currency"		: "USD",
		"attach"		: "link",
		"everyMonday"		: 1,  // WAARSCHUWING: zodra je minimaal één every*-variabele opgeeft, worden ALLE bestaande every*-variabelen gewist.
		"everyMonthDay1"	: 15,  // Als je bijvoorbeeld "everyFriday"=1 had, verwijdert het instellen van "everyMonthDay3" die "everyFriday".
		// ... enzovoort (zie spreadsheetAutoCreate voor alle every*-variabelen).
		"time"			: "3:59pm",
		"timezone"		: "America/Los_Angeles",
	}
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "spreadsheetAutoEdit",
			"ok"	: 3,  // Aantal aangebrachte wijzigingen.
		},
		...
	]
}

Concurrenten en meer

competitorDeleteAll - Een concurrent uit alle producten of categorieën verwijderen

Hiermee verwijder je in één keer de URL's van een concurrent uit alle producten of uit alle producten in bepaalde categorieën.
WAARSCHUWING: de URL's van de concurrent worden onmiddellijk en definitief uit je account verwijderd.
Dit is dezelfde functie als in de gebruikersinterface wanneer je de pagina van een concurrent opent en op Delete from all Products klikt, of op de pagina van een categorie op het pictogram (X) klikt in de lijst met concurrenten.
{ "actions" : [
	...
	{
		"a"		: "competitorDeleteAll",
		"domain"	: "competitordomain.com",
		"categories"	: ["The Category 1", "The Category 2"],  // (optioneel) Indien weggelaten, moet je "allProducts" = 1 gebruiken.
		"allProducts"	: 1,  // (optioneel) Om uit alle producten te verwijderen ("categories" mag NIET worden opgegeven).
		// Geef dus "categories" of "allProducts" op: niet beide, maar wel één van de twee.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "competitorDeleteAll",
			"ok"	: 10,  // Aantal verwijderde URL's.
		},
		...
	]
}

mathEdit - Prijsberekeningen voor een domein instellen of wijzigen

Dit is dezelfde functie die de gebruikersinterface gebruikt wanneer je naar Domains gaat, de domeinnaam van een concurrent in de lijst kiest en vervolgens op Mathematically alter the price klikt. Alles wat je in dat formulier kunt instellen, kun je ook via de API-actie mathEdit instellen.
Klik in je account op de groene vraagtekens voor uitleg bij elk veld.
{ "actions" : [
	...
	{
		"a"		: "mathEdit",
		"domain"	: "competitordomain.com",
		"clear"		: 1,  // (optioneel) Schakel alle prijsberekeningen voor dat domein uit (verwijdert alle eerdere instellingen).
		// Als je clear:1 instelt, mag je hieronder niets anders opgeven, anders krijg je een fout.
		"math"	: [  // Array met toe te passen rekenblokken.
			{  // Dit is één rekenblokobject; alle velden zijn optioneel.
				"categories"		: ["Category 1", "Category 2"],  // Alleen voor producten in deze categorieën.
				"theirPriceMin"		: 1234.90,  // Alleen wanneer hun prijs groter dan of gelijk aan N is.
				"theirPriceMinCurrency"	: "USD",  // Valuta (gebruik "original" voor dezelfde valuta als op de website).
				"theirPriceMax"		: 1234.90,  // ... kleiner dan of gelijk aan.
				"theirPriceMaxCurrency"	: "USD",  // Valuta (...).
				"themMeMin"		: -20.00,  // Alleen als [hun prijs - mijn prijs] groter dan of gelijk aan N is (zie gebruikersinterface).
				"themMeMinCurrency"	: "USD",  // Valuta of "%" van je eigen prijs (hier NIET "original").
				"themMeMax"		: -1.5,  // ... kleiner dan of gelijk aan.
				"themMeMaxCurrency"	: "%",  // Valuta (...).
				"addPre"		: -10.00,  // Bedrag dat je vóór het vermenigvuldigen optelt (of aftrekt als het negatief is).
				"addPreCurrency"	: "USD",  // Valuta (gebruik "original" voor dezelfde valuta als op de website).
				"multiply"		: 1.1,  // Vermenigvuldig met deze factor.
				"divide"		: 1.1,  // OF deel door deze factor (niet allebei opgeven).
				"addPost"		: 5.00,  // Bedrag dat je ná het vermenigvuldigen optelt (of aftrekt als het negatief is).
				"addPostCurrency"	: "USD",  // Valuta (...).
				// Klinkt ingewikkeld? Bekijk ons eenvoudige voorbeeld onder het antwoord.
			},
			... // In totaal maximaal 10 blokken (berekeningen worden in volgorde uitgevoerd).
		],
		// LET OP: je kunt momenteel niet slechts één variabele of één rekenblok aanpassen. Als je de array "math" opgeeft, worden ALLE bestaande instellingen vervangen.
		// LET OP: een rekenblok zonder vermenigvuldiging of deling (weggelaten of factor 1) én zonder addPre!=0 of addPost!=0 wordt genegeerd.
		// Als alle blokken worden genegeerd, is het effect hetzelfde als alle berekeningen wissen met clear:1.
		// De berekeningen moeten dus echt iets veranderen om opgeslagen te worden.
		// TIP: wil je de berekeningen voor een domein tijdelijk uitschakelen zonder alles te verwijderen,
		// dan kun je categories : ["Some Empty Existing Category"] instellen.
	},
	...
] }
ANTWOORD:
{
	...
	"actions" : [
		...
		{
			"a"	: "mathEdit",
			"ok"	: 3,  // Aantal gewijzigde rekenblokken (verwijderen/wissen telt als wijziging).
		},
		...
	]
}
EENVOUDIG VOORBEELD - Verwijder 10% belasting bij amazon.co.uk:
{ "actions" : [
	{
		"a"		: "mathEdit",
		"domain"	: "amazon.co.uk",
		"math"		: [
			{
				"divide"	: 1.1
			}
		]
	}
] }

Meer voorbeelden

Deze verzoeken zijn POST gegevens die worden verzonden naar https://pricezag.com/api/v3/MYAPIKEY
▶ VOORBEELD 1 - De kostprijs van een product bijwerken
VERZOEK:
{
	"actions" : [
		{
			"a"		: "productEdit",
			"code"		: "SKU-1234",
			"cost"		: 140.50,
			"costCurrency"	: "EUR"
		}
	]
}
ANTWOORD:
{
	"ok"		: 1,  // Zou 0 teruggeven als SKU-1234 al deze kostprijs had.
	"errors"	: 0,  // Zou 1 teruggeven als SKU-1234 niet bestond.
	"actionsCount"	: 1,
	"actions" : [
		{
			"a"	: "productEdit",
			"ok"	: 1  // Zou 0 teruggeven als SKU-1234 al deze kostprijs had, en -1 als het product niet bestond.
		}
	]
}

▶ VOORBEELD 2 - Een niet-bestaand product opvragen
VERZOEK:
{
	"actions" : [
		{
			"a"		: "productGet",
			"code"		: "NON-EXISTING-SKU",
			"currency"	: "USD"
		}
}
ANTWOORD:
{
	"ok"		: 0,  // Omdat geen enkele actie ok>0 teruggaf.
	"errors"	: 1,  // Omdat één actie ok<0 teruggaf.
	"actionsCount"	: 1,
	"actions" : [
		{
			"a"	: "productGet",
			"ok"	: -1,  // Hieraan zie je dat de actie is mislukt.
			"error"	: "Sorry, the product #NON-EXISTING-SKU does not exist. Maybe someone else just removed or renamed it?"
		}
	]
}

▶ VOORBEELD 3 - Een categorie en een prijsregel aanmaken en vervolgens twee producten eraan toewijzen
VERZOEK:
{
	"actions" : [
		{
			"a"		: "categoryCreate",
			"name"		: "My New Category"
		},
		{
			"a"		: "repricingCreate",
			"name"		: "My New Repricing Rule",
			"init"	: {
				"target"	: "cheapest_n",
				"var_n"		: 2,
				"plusAmount"	: 0,
				"plusCurrency"	: "%"
				// Dit betekent: "Stel mijn prijs in op het midden tussen de 2 goedkoopste concurrenten".
			},
			"never"	: [
				{
					"target"	: "cost",
					"direction"	: "below",
					"plusAmount"	: 5,
					"plusCurrency"	: "%"
					// Dit betekent: "Maar nooit onder mijn kostprijs + 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",  // Dezelfde regelnaam die we zojuist hebben aangemaakt.
			"categories"	: ["My New Category"],	// Dezelfde categorienaam die we zojuist hebben aangemaakt.
			// ... hoewel productCreate ontbrekende categorieën zelf aanmaakt; categoryCreate was dus niet nodig.
			"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://..."]
		}
	]
}
ANTWOORD:
{
	"ok"		: 4,  // Omdat alle 4 acties ok>0 teruggaven.
	"errors"	: 0,  // Omdat geen enkele actie ok<0 teruggaf.
	"actionsCount"	: 4,
	"actions" : [
		{
			"a"	: "categoryCreate",
			"ok"	: 1
		},
		{
			"a"	: "repricingCreate",
			"ok"	: 1
		},
		{
			"a"	: "productCreate",
			"ok"	: 1
		},
		{
			"a"	: "productCreate",
			"ok"	: 1
		}
	]
}

▶ VOORBEELD 4 - Twee categorieën samenvoegen in een andere en de oorspronkelijke categorieën verwijderen
VERZOEK:
{
	"actions" : [
		{
			"a"			: "categoryCopy",
			"categoriesFrom"	: ["Original Category 1", "Original Category 2"],
			"deleteMode"		: "cat",
			// LET OP: "removeMode":"cat" is overbodig omdat deleteMode deze twee categorieën toch al verwijdert.
			"categoriesTo"		: ["A New Category"]
		}
}
ANTWOORD:
{
	"ok"		: 1,  // Omdat één actie ok>0 teruggaf.
	"errors"	: 0,  // Omdat geen enkele actie ok<0 teruggaf.
	"actionsCount"	: 1,
	"actions" : [
		{
			"a"			: "categoryCopy",
			"ok"			: 3,  // Omdat 3 categorieën zijn gewijzigd: de twee oorspronkelijke zijn verwijderd en één doelcategorie is aangemaakt.
			"categoriesCreated"	: 1,
			"categoriesDeleted"	: 2,
			"categoriesModified"	: 0,
			"productsCount"		: 123
		}
	]
}

▶ VOORBEELD 5 - De N-variabele en richting van een alertregel wijzigen
VERZOEK:
{
	"actions" : [
		{
			"a"		: "alertRuleEdit",
			"email"		: "john@example.net",
			"ruleNumber"	: 3,
			"rule"		: {
				"var_n"		: 1.5,
				"direction"	: "drop"
			}
		}
}
ANTWOORD:
{
	"ok"		: 1,  // Omdat één actie ok>0 teruggaf.
	"errors"	: 0,  // Omdat geen enkele actie ok<0 teruggaf.
	"actionsCount"	: 1,
	"actions" : [
		{
			"a"	: "alertRuleEdit",
			"ok"	: 2  // Omdat 2 variabelen succesvol zijn gewijzigd.
		}
	]
}