EN PL

EDU WebApi

1. Możliwości API

EDU WebAPI pozwala na: Po zrealizowaniu zamówienia klient otrzyma fakturę w postaci elektronicznej na adres mailowy wskazany przy tworzeniu zamówienia.

EDU WebAPI zostało stworzone w oparciu o rozwiązanie REST, dzięki temu dostęp do API jest bardzo prosty. Do autoryzacji aplikacja wykorzystuje protokół autoryzacji OAuth2. Wiąże się to z koniecznością otrzymania danych dostępowych oraz wygenerowania tokena w celu wywołania żądań.

Złożenie zamówienia (https://api.eduksiazka.pl/api/Order), kończy się informacją zwrotną:
            
{
    "Status": "OK",
    "StatusDetails": [
        {
            "HttpStatusCode": 201,
            "Opis": "Utworzono wpis o numerze: 12345, nr wew.: test0001",
            "Message": "Created entry with id: 12345, client's id: test00001"
        }
    ],
    "ItemsErrors": []
}
					
				

Uwaga:

Do kontaktów z działem handlowym prosimy wykorzystywać numer przekazany w trakcie tworzenia zamówienia order_id - Numer ID zamówienia w bazie klienta.

                {
                ...
                order_id:"20145264"
                ...
                }
                


2. Dostępne metody Web API


Przykład użycia w języku C#:
 
            string username = "MY_USERNAME";
            string password = "MY_PASSWORD";
            var client = new RestClient("https://api.eduksiazka.pl/api/token"); //Ustawianie adresu metody 
            var request = new RestRequest(Method.POST); //Ustawianie typu metody 
            request.AddHeader("content-type", "application/x-www-form-urlencoded");
            request.AddParameter("application/x-www-form-urlencoded", string.Format("grant_type=password&username={0}&password={1}", username, password), ParameterType.RequestBody);
            var queryResult = client.Execute <List<RestRequest>>(request);
            dynamic obj = JsonConvert.DeserializeObject<dynamic>(queryResult.Content); 
            JObject parsed = JObject.Parse(queryResult.Content);
            foreach (var pair in parsed)
            {
                Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
            }
        


Przykładowa odpowiedź JSON:

        {
        "access_token": "8P4KhaVTH...",                                                                                  
        "token_type": "bearer", 
        "expires_in": 3599 
        }               



Przykład użycia w języku C#:
 
            string ACCESS_TOKEN = "8P4KhaVTH...";
            client = new RestClient("https://api.eduksiazka.pl/api/PH/GetDeliveryAddresses");
            request = new RestRequest(Method.GET);
            request.AddHeader("content-type", "application/json");
            request.AddHeader("authorization", string.Format("Bearer {0}", ACCESS_TOKEN));
            queryResult = client.Execute<List<RestRequest>>(request);
            obj = JsonConvert.DeserializeObject<dynamic>(queryResult.Content);
            parsed = JObject.Parse(queryResult.Content);
            foreach (var pair in parsed)
            {
                Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
            }
        
Przykładowa odpowiedź:
 
{
	"Table": [
		{
			"CardCode": "O123456",
			"SystemName": "Edu Błonie",
			"Address": "Pass 20L magazyn nr 7 05-870 Błonie"
		},
		{
			"CardCode": "O123456",
			"SystemName": "Edu H.Lublin",
			"Address": "Rapackiego 25 20-150 Lublin"
		}
	]
}

Uwaga:

Proszę zwrócić uwagę na wartości SystemName, które wykorzystywane będą przy tworzeniu zamówień jako adres dostawy.

Przykład użycia w języku C#:
 
                string ACCESS_TOKEN = "8P4KhaVTH..."; 
                client = new RestClient("https://api.eduksiazka.pl/api/products/GetStock2"); 
                request = new RestRequest(Method.GET); 
                request.AddHeader("content-type", "application/json"); 
                request.AddHeader("authorization", string.Format("Bearer {0}", ACCESS_TOKEN)); 
                queryResult = client.Execute<List<RestRequest>>(request); 
                obj = JsonConvert.DeserializeObject<dynamic>(queryResult.Content); 
                parsed = JObject.Parse(queryResult.Content); 
                foreach (var pair in parsed) 
                { 
                      Console.WriteLine("{0}: {1}", pair.Key, pair.Value); 
                }  
Przykładowy fragment odpowiedzi:

                { 
                  "Table": 
                    [ 
                     { 
                     "ItemCode": "0000000000644", 
                     "Blonie": 5, 
                     "Kielce": 0, 
                     "Krakow": 2, 
                     "Lublin": 1
                     },
                ... 
                     { 
                     "ItemCode": "0000000006448",  
                     "Blonie": 100, 
                     "Kielce": 3, 
                     "Krakow": 0, 
                     "Lublin": 3
                     } 
                  ] 
                }
            
Przykład użycia w języku C#:
 
                string ACCESS_TOKEN = "8P4KhaVTH..."; 
                client = new RestClient("https://api.eduksiazka.pl/api/products/GetProductsInfo"); 
                request = new RestRequest(Method.GET); 
                request.AddHeader("content-type", "application/json"); 
                request.AddHeader("authorization", string.Format("Bearer {0}", ACCESS_TOKEN)); 
                queryResult = client.Execute<List<RestRequest>>(request); 
                obj = JsonConvert.DeserializeObject<dynamic>(queryResult.Content); 
                parsed = JObject.Parse(queryResult.Content); 
                foreach (var pair in parsed) 
                { 
                      Console.WriteLine("{0}: {1}", pair.Key, pair.Value); 
                }  
            
Przykładowy fragment odpowiedzi:

 {
    "Table": [
    {
    "ItemCode": "9788382625424",
    "ItemName": "Maxinaklejki. Mój świat",
    "Status": "Aktywny - dostępny",
    "Publisher": "Olesiejuk",
    "NetPrice": 23.80,
    "VAT": "5",
    "NetPriceAfDisc": 15.23,
    "FullDescription": "Książka z piękną scenerią inspirowaną światem wokół nas, uzupełniona dużymi naklejkami, odpowiednia dla młodszych dzieci. Każda strona zawiera różne ustawienia, w których dziecko może dać upust swojej fantazji i ozdobić je za pomocą nalepek znajdujących się w książce.",
    "Author": "praca zbiorowa",
    "Format": "",
    "Binding": "miekka",
    "Image": "https://eduksiazka.pl/media/catalog/product/9/7/9788382625424_fd0a.jpg",
    "Publishment_Year": "2022",
    "Level": "",
    "Subject": "",
    "Category": "Książki dla dzieci",
    "WebCategory": "Default Category->Książki->Książki dla dzieci->3 - 5 lat->Kolorowanki i naklejki->Kolorowanki z naklejkami i zestawy",
    "Weight": "0.3160",
    "Length": "24.1000",
    "Width": "32.0000",
    "Height": "0.6000"
    },
    {
    "ItemCode": "9788368132229",
    "ItemName": "Zima. Malowanie farbkami",
    "Status": "Aktywny - dostępny",
    "Publisher": "Olesiejuk",
    "NetPrice": 12.37,
    "VAT": "5",
    "NetPriceAfDisc": 7.92,
    "FullDescription": "

Puść wodze fantazji, chwyć pędzelek do ręki i nadaj czarno-białym obrazkom niesamowite barwy. Kartki możesz wyrwać i ozdobić nimi pokój - Twoje dzieła pozostaną z Tobą na długo !

", "Author": "", "Format": "", "Binding": "miekka", "Image": "https://eduksiazka.pl/media/catalog/product/9/7/9788368132229_9f82.jpg", "Publishment_Year": "2025", "Level": "", "Subject": "", "Category": "Książki dla dzieci", "WebCategory": "Default Category->Książki->Książki dla dzieci->3 - 5 lat->Kolorowanki i naklejki->Kolorowanki z naklejkami i zestawy", "Weight": "0.1580", "Length": "28.2000", "Width": "28.4000", "Height": "1.1000" } ] }
Przykład użycia w języku C#:
 
                string ACCESS_TOKEN = "8P4KhaVTH..."; 
                client = new RestClient("https://api.eduksiazka.pl/api/Invoices?format=JSON&number=1807102370"); 
                request = new RestRequest(Method.GET); 
                request.AddHeader("content-type", "application/json"); 
                request.AddHeader("authorization", string.Format("Bearer {0}", ACCESS_TOKEN)); 
                queryResult = client.Execute<List<RestRequest>>(request); 
                obj = JsonConvert.DeserializeObject<dynamic>(queryResult.Content); 
                parsed = JObject.Parse(queryResult.Content); 
                foreach (var pair in parsed) 
                { 
                      Console.WriteLine("{0}: {1}", pair.Key, pair.Value); 
                }  
            
Przykładowy fragment odpowiedzi jako JSON:

			[
			{
				"Document-Invoice": {
					"Invoice-Header": {
						"InvoiceNumber": "1807102370",
						"InvoiceDate": "2018-07-25T00:00:00",
						"SalesDate": "2018-07-25T00:00:00",
						"InvoiceCurrency": "PLN",
						"InvoicePaymentDueDate": "2018-08-08T00:00:00",
						"InvoicePostDate": "2018-07-25T00:00:00",
						"InvoiceComments": "0"
					},
					"Invoice-Parties": {
						"Buyer": {
							"TaxID": "",
							"Name": "Firma 1",
							"StreetAndNumber": "Rolna 8",
							"CityName": "Kielce",
							"PostalCode": "25-419",
							"Country": "PL"
						},
						"Shipment": {
							"Name": "Kielce",
							"SteetAndNumber": "Rolna 8",
							"CityName": "Kielce",
							"PostalCode": "25-419",
							"Country": "PL"
						},
						"Seller": {
							"ILN": "PL5272523217",
							"TaxID": "PL5272523217",
							"AccountNumber": "",
							"Name": "EDU-KSIĄŻKA Sp. z o.o.",
							"StreetAndNumber": "Kolejowa 5/7",
							"CityName": "Warszawa",
							"PostalCode": "01-217",
							"Country": "PL"
						}
					},
					"Invoice-Lines": [
						{
							"LineItem": {
								"LineNumber": "1",
								"EAN": "9788361243021",
								"BuyerItemCode": "",
								"SupplierItemCode": "9788361243021",
								"ItemDescription": "Sky High PL 1 SB + CD-ROM",
								"InvoiceQuantity": 1,
								"UnitOfMeasure": "",
								"InvoiceUnityNetPrice": 51.33,
								"InvoiceUnitNetPriceAfDisc": 51.33,
								"InvoiceUnitGrossPrice": 53.90,
								"TaxRate": 5.0,
								"TaxCategoryCode": "F05",
								"TaxReference": {
									"ReferenceType": "PKWiU",
									"ReferenceNumber": ""
								},
								"TaxAmount": 2.57,
								"NetAmount": 51.33
							}
						}
					],
					"Invoice-Summary": {
						"TotalLines": 1,
						"TotalNetAmount": 51.33,
						"TotalTaxableBasis": 51.33,
						"TotalTaxAmount": 2.57,
						"TotalGrossAmount": 53.90,
						"TaxSummary": [
							{
								"TaxSummaryLine": {
									"TaxRate": 5.0,
									"TaxCategoryCode": "F05",
									"TaxAmount": 2.57,
									"TaxableBasis": 51.33,
									"TaxableAmount": 51.33,
									"GrossAmount": 53.90
								}
							}
						]
					}
				}
			}
		]
            
Przykładowy fragment odpowiedzi jako XML przykład Przykład użycia w języku C#:

                    string ACCESS_TOKEN = "8P4KhaVTH...";
                    client = new RestClient("https://api.eduksiazka.pl/api/CorrectionInvoices?format=JSON&number=1807102370");
                    request = new RestRequest(Method.GET);
                    request.AddHeader("content-type", "application/json");
                    request.AddHeader("authorization", string.Format("Bearer {0}", ACCESS_TOKEN));
                    queryResult = client.Execute<List<RestRequest>>(request);
                    obj = JsonConvert.DeserializeObject<dynamic>(queryResult.Content);
                    parsed = JObject.Parse(queryResult.Content);
                    foreach (var pair in parsed)
                    {
                    Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
                    }
                
Przykładowy fragment odpowiedzi jako JSON:

                    {
                        "CorrectionInvoices": 
                        [
                            {
                                "CorrectionInvoiceNumber": "120...",
                                "FileName": "FKPL120....pdf",
                                "Content": "JVBERi0xLjcgCiXi48/TIAoxIDAgb2JqIAo8PC..."
                            }
                        ]
                    }
                
Obiekt order
# Nazwa pola Typ danych Wymagane Opis
1 order_id String TAK Numer ID zamówienia w systemie klienta. Pole przyjmuje maksymalnie 20 znaków
2 order_address_nazwa String TAK Systemowa nazwa adresu dostawy (SystemName w metodzie GetDeliveryAddresses)
3 order_comments String NIE Opcjonalny komentarz do zamówienia
4 order_email String TAK Adres email na który ma zostać wysłany dokument FV
5 order_magazyn String NIE Magazyn z jakiego zamawiany jest towar.
Wartośći obecnie dostępne to: 01 (wartość domyślna), 04, 06, 07.
Poniżej krótki opis każdej z wartości: (dane odwołują się do wartości zwracanych przez metodę GetStock):
  • 01 - Blonie
  • 04 - Kielce
  • 06 - Krakow
  • 07 - Lublin
6 order_partialDelivery Boolean NIE Domyślnie ustawiony na "false". Ustawienie na "true" pozwala na dodanie zamówienia z towarami, które nie są dostępne na stanie.
7 c_ETB_MG2_ORDERLINE Array TAK Zamawiane towary

Obiekt c_ETB_MG2_ORDERLINE
# Nazwa pola Typ danych Wymagane Opis
1 orderline_itemcode String TAK ISBN zamawianego towaru
2 orderline_quantity Integer TAK Ilość zamawianego towaru(wartość musi być większa niż 0)

Przykład użycia w języku C#:

	string ACCESS_TOKEN = "8P4KhaVTH..."; 
						
	client = new RestClient("https://api.eduksiazka.pl/api/Order"); 
						
	request = new RestRequest(Method.POST); 
	request.AddHeader("content-type", "application/json"); 
	request.AddHeader("authorization", string.Format("Bearer {0}", ACCESS_TOKEN)); 
						
	dynamic jOrder = new JObject(); 
						
	jOrder.order_id = "test0001"; 
	Order.order_comments = "testowy komentarz"; 
	jOrder.order_address_nazwa = "Edu H.Lublin"; 
	jOrder.order_email = "adres@pl";                     
	jOrder.c_ETB_MG2_ORDERLINE = new JArray() as dynamic; 
						
	dynamic jOrderLine = new JObject(); 
	jOrderLine.orderline_itemcode = "0000000000644"; 
	jOrderLine.orderline_quantity = 3; 
	jOrder.c_ETB_MG2_ORDERLINE.Add(jOrderLine); 
	jOrderLine = new JObject(); 
	jOrderLine.orderline_itemcode = "00000000006448"; 
	jOrderLine.orderline_quantity = 10; 
						
	jOrder.c_ETB_MG2_ORDERLINE.Add(jOrderLine); 
						
	request.AddJsonBody(jOrder.ToString()); 
						
	queryResult = client.Execute<List<RestRequest>>(request); 
						
	obj = JsonConvert.DeserializeObject<dynamic>(queryResult.Content); 
	parsed = JObject.Parse(jOrder.ToString()); 
						
	foreach (var pair in parsed)
	{
		Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
	}

	var status = JObject.Parse(queryResult.Content);


	Console.WriteLine("\nAPI response: ");

	foreach (var pair in status)
	{
		Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
	}


	Console.ReadKey();
                        

Jeżeli metoda została wywołana poprawnie to serwer zwróci następującą odpowiedź:

                
{
    "Status": "OK",
    "StatusDetails": [
        {
            "HttpStatusCode": 201,
            "Opis": "Utworzono wpis o numerze: 12345, nr wew.: test0001",
            "Message": "Created entry with id: 12345, client's id: test00001"
        }
    ],
    "ItemsErrors": []
}
					
				

3. Błędy

Większość błędów zwracan jest w formie pliku JSON o następującej strukturze: Poniżej znajduje się wizualizacja pliku:

{
  "Status": "ERROR",
  "StatusDetails": [
    {
      "HttpStatusCode": "kod",
      "Opis": "Wiadomość w języku polskim",
      "Message": "Wiadomość w języku angielskim"
    },
	...
  ],
  "ItemsErrors": [
    {
      "orderline_itemcode": "ISBN",
      "Opis": "Wiadomość w języku polskim",
      "Message": "Wiadomość w języku angielskim"
    },
	...
  ]
}

				

# Błąd Kod HTTP Opis
1 Nie znaleziono strony 404 Adres nie odnaleziony. Sprawdź czy adres wprowadzony jest poprawny
2 Odmowa autoryzacji tego żądania 401 Podano nieprawidłowy token lub token wygasł
3 Data you provided are incorrect 400 Dane dostępowe są nieprawidłowe (username i/lub password)
4 Wymagany SSL! Spróbuj użyć linków z HTTPS 403 Próba podłączenia przez http. Należy zmienić na https (wymagany)
5 Access to API has expired. Please contact person responsible for granting you access 400 Dostęp do API utracił ważność skontaktuj się osobą odpowiedzialną za udzielenie dostępu
6 Błąd dodawania - brak towarów w zamówieniu 406 Nie dodano towarów do zamówienia
7 Wartość orderline_itemcode nie może być pusta 406 Nie podano ISBN towaru
8 Wartość orderline_quantity nie może być pusta 406 Nie podano ilości zamawianego towaru
9 Wartość orderline_quantity musi być większa od zera 406 Ilość zamawianego towaru musi być większa niż 0
10 Wystąpił błąd dla wybranych towarów. Sprawdź szczegóły w sekcji ItemsErrors[] 406 Wystąpiły błędy dla wybranych towarów. Błąd najcześciej spowodowany jest przez brak stanu na magazynie dla tytułów. Sprawdź sekcje ItemsError[] aby dowiedzieć się więcej
11 Wartość order_address_nazwa nie może być pusta 406 Nie podano SystemName adresu dostawy
12 Wartość order_address_nazwa nie może być pusta 406 Nie podano wartości order_id
13 Wartość order_email nie może być pusta 406 Nie podano wartości order_email
14 Wartość order_magazyn nie może być pusta 406 Wartość order_magazyn została podana jako pusta lub null
15 Wybrany magazyn nie jest dostępny 406 Nie masz uprawnień do zamówień z wybranego magazynu
16 Wszystkie towary w zamówieniu są niedostępne 406 Podane w zamówieniu towary nie są dostępne. Sprawdź listę towarów zwracaną przez metodę GetStock
17 Brak towaru o podanym kodzie 406 W zamówieniu podano towar, który nie jest dostępny. Sprawdź listę towarów zwracaną przez metodę GetStock
18 Format danych JSON jest nieprawidłowy 400 Nieprawidłowa struktura przesyłanych danych w zamówieniu
19 Podany format parametru dateFrom jest nieprawidłowy 406 Data w parametrze dateFrom przyjmuje nieprawidłowy format.
Prawidłowy format to YYYY-MM-dd hh:mm:ss, gdzie:
  • YYYY - to rok np. 2020;
  • MM - miesiąc (01-12);
  • dd - dzień (01-31 zależnie od miesiąca);
  • hh - godzina w formacie 24h;
  • mm - minuta (01-59);
  • ss - sekunda (01-59);
20 Wartość pola order_id nie może być dłuższa niż 20 znaków 406 Wartość pola order_id przyjmuje maksymalnie 20 znaków



© Edu-Książka Sp. z o.o.