# Add Parcel

### General information

The function adds parcel allows adding or remove the parcels in full autonomy, with their corresponding labels.

### List of enabled couriers

\* see [notes](#notes-about-couriers)

|   COURIERS (Gsped ID)   | ADDING | REMOVING |
| :---------------------: | :----: | :------: |
|        BRT\* (1)        |   Yes  |    Yes   |
|        TNT\* (2)        |   Yes  |    Yes   |
|      DPDFrance (6)      |   Yes  |    Yes   |
|   PDB Inviosystem (19)  |   Yes  |    Yes   |
|       Dummy1 (70)       |   Yes  |    Yes   |
|       Dummy2 (71)       |   Yes  |    Yes   |
|       Dummy3 (72)       |   Yes  |    Yes   |
|       Dummy4 (73)       |   Yes  |    Yes   |
|       Dummy5 (74)       |   Yes  |    Yes   |
|       Dummy6 (75)       |   Yes  |    Yes   |
|       Dummy7 (76)       |   Yes  |    Yes   |
|       Dummy8 (77)       |   Yes  |    Yes   |
|       Dummy9 (78)       |   Yes  |    Yes   |
|       Dummy10 (79)      |   Yes  |    Yes   |
|    Italsempione (90)    |   Yes  |    Yes   |
|    Logisticando (91)    |   Yes  |    Yes   |
|    CSI Logistica (92)   |   Yes  |    Yes   |
|      Ribosped (93)      |   Yes  |    Yes   |
|    Zust - Tiesse (94)   |   Yes  |    Yes   |
|        Lynx (95)        |   Yes  |    Yes   |
|     Speditalia (97)     |   Yes  |    Yes   |
|           SVL           |   Yes  |    Yes   |
|        ARCO (100)       |   Yes  |    Yes   |
|        GLS (101)        |   Yes  |    No    |
|       Fercam (131)      |   Yes  |    Yes   |
|      Liccardi (179)     |   Yes  |    Yes   |
|      DHL WLA (182)      |   Yes  |    Yes   |
| Ferrari Trasporti (190) |   Yes  |    Yes   |
|      Bracchi (191)      |   Yes  |    Yes   |
|      Sending (192)      |   Yes  |    Yes   |
|  Rhenus Logistics (193) |   Yes  |    Yes   |

{% hint style="info" %}
The list of enabled couriers is subject to change and modifications.
{% endhint %}

<details>

<summary>Notes about couriers</summary>

* BRT --> Only B2 solution
* TNT --> Only for the same label creation date and before the withdrawal date/time of the same. If necessary to extend this date, consult the Expected Assignment Date section               &#x20;

</details>

### How the Add Parcel function works

To successfully use the Add Parcel function 3 endpoints must be used:

1. **Shipment** POST - For the shipment creation
2. **Parcels** POST or DELETE - To add or remove the parcels
3. **ShipmentConfirm** POST - For the final shipment confimation. You will no longer be able to change.

{% hint style="danger" %}
PLEASE NOTE: the removal of a parcel in a single-parcel shipment automatically cancels of the shipment.
{% endhint %}

{% hint style="info" %}
PLEASE NOTE: the final confirmation blocks the possibility to add or remove one or more parcels from the shipment
{% endhint %}

## Add a single parcel to a shipment

<mark style="color:green;">`POST`</mark> `https://api.gsped.it/[INSTANCE]/Parcels`

Body in JSON.

\\

It works in 2 ways: \\

1 - Shipment ID + parcel data

\\

2 - Recepient data + parcel data

#### Request Body

| Name                                                  | Type   | Description                              |
| ----------------------------------------------------- | ------ | ---------------------------------------- |
| id\_sped<mark style="color:red;">\*</mark>            | String | Unique Gsped ID                          |
| ddt\_alpha<mark style="color:red;">\*</mark>          | String | Alphanumerical reference of the shipment |
| rcpt\_name<mark style="color:red;">\*</mark>          | String | Name of the recepient                    |
| rcpt\_addr<mark style="color:red;">\*</mark>          | String | Address of the recepient                 |
| rcpt\_city<mark style="color:red;">\*</mark>          | String | City of the recepient                    |
| rcpt\_cap<mark style="color:red;">\*</mark>           | String | Zip code of the recepient                |
| rcpt\_prov<mark style="color:red;">\*</mark>          | String | Province/country of the recepient        |
| rcpt\_country\_code<mark style="color:red;">\*</mark> | String | Country of the recepient iso code 2 char |
| collo<mark style="color:red;">\*</mark>               | Object | Parcel data                              |

{% tabs %}
{% tab title="200: OK Parcel successfully added" %}

```javascript
{
    "id_collo": 2,
    "id_sped": "123456789",
    "labels": {
        "jpg": "Stringa base64",
        "pdf": "Stringa base64",
        "zpl": "Stringa ZPL"
    },
    "tracking_collo": "JJD01111111111"
}
```

{% endtab %}

{% tab title="400: Bad Request Wrong payload" %}

```javascript
{
  "error": "Dati spedizione non presenti o in formato sbagliato" 
}
```

{% endtab %}

{% tab title="404: Not Found Shipment ID not found" %}

```javascript
{
  "error": "Shipment '1234' doesn't exists!"
}
```

{% endtab %}

{% tab title="404: Not Found Unable to find unique shipment via recepient data" %}

```javascript
{
  "error": "Unable to find unique shipment by ddt and address"
}
```

{% endtab %}
{% endtabs %}

### Parcel object

| Attribute                        | Type    | Required |
| -------------------------------- | ------- | :------: |
| peso (weight)                    | integer |     X    |
| volume                           | float   |     X    |
| larghezza (width)                | integer |     X    |
| altezza (height)                 | integer |     X    |
| lunghezza (lenght)               | integer |     X    |
| codice\_collo (parcel reference) | string  |          |

### Example of Payload Parcels POST

{% tabs %}
{% tab title="Shipment ID" %}

```json
{
  "id_sped":"1234567",
  "collo": {
    "peso": "5",
    "volume": "0.01",
    "larghezza": "35",
    "altezza": "15",
    "lunghezza": "10",
    "codice_collo": "reference1234"
  }
}
```

{% endtab %}

{% tab title="Recepient data" %}

```json
{
  "ddt_alpha":"test_parcel_8",
  "rcpt_name":"Rossi Gino",
  "rcpt_addr":"Via Milano 8",
  "rcpt_cap":"20123",
  "rcpt_city":"Milano",
  "rcpt_prov":"MI",
  "rcpt_country_code" : "IT",
  "collo": {
    "peso": "5",
    "volume": "0.01",
    "larghezza": "35",
    "altezza": "15",
    "lunghezza": "20",
    "codice_collo": "reference1234"
  }
}
```

{% endtab %}
{% endtabs %}

### Example of Snippet Parcel POST

{% tabs %}
{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.gsped.it/sandbox/Parcels",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\n  \"id_sped\":\"1\",\n  \"collo\": {\n    \"peso\": \"5\",\n    \"volume\": \"0.01\",\n    \"larghezza\": \"35\",\n    \"altezza\": \"15\",\n    \"lunghezza\": \"10\"\n  }\n}",
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/json",
    "x-api-key: YOUR-API-KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
```

{% endtab %}

{% tab title="Python" %}

```python
import http.client

conn = http.client.HTTPSConnection("api.gsped.it")

payload = "{\n  \"id_sped\":\"1\",\n  \"collo\": {\n    \"peso\": \"5\",\n    \"volume\": \"0.01\",\n    \"larghezza\": \"35\",\n    \"altezza\": \"15\",\n    \"lunghezza\": \"10\"\n  }\n}"

headers = {
    'Content-Type': "application/json",
    'x-api-key': "YOUR-API-KEY"
    }

conn.request("POST", "/sandbox/Parcels", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
```

{% endtab %}

{% tab title="GO" %}

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.gsped.it/sandbox/Parcels"

	payload := strings.NewReader("{\n  \"id_sped\":\"1\",\n  \"collo\": {\n    \"peso\": \"5\",\n    \"volume\": \"0.01\",\n    \"larghezza\": \"35\",\n    \"altezza\": \"15\",\n    \"lunghezza\": \"10\"\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("x-api-key", "YOUR-API-KEY")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://api.gsped.it/sandbox/Parcels"),
    Headers =
    {
        { "x-api-key", "YOUR-API-KEY" },
    },
    Content = new StringContent("{\n  \"id_sped\":\"1\",\n  \"collo\": {\n    \"peso\": \"5\",\n    \"volume\": \"0.01\",\n    \"larghezza\": \"35\",\n    \"altezza\": \"15\",\n    \"lunghezza\": \"10\"\n  }\n}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl --request POST \
  --url https://api.gsped.it/sandbox/Parcels \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR-API-KEY' \
  --data '{
  "id_sped":"1",
  "collo": {
    "peso": "5",
    "volume": "0.01",
    "larghezza": "35",
    "altezza": "15",
    "lunghezza": "10"
  }
}'
```

{% endtab %}
{% endtabs %}

## Parcel removal from shipment

<mark style="color:red;">`DELETE`</mark> `https://api.gsped.it/[INSTANCE]/Parcels`

Form Url-Encoded Body

\
It works in 2 ways: \\

1 Shipment ID + parcel data

\\

2 Recepient data + parcel data

#### Request Body

| Name                | Type   | Description                                |
| ------------------- | ------ | ------------------------------------------ |
| id\_sped            | String | Unique Gsped ID                            |
| ddt\_alpha          | String | Alphanumerical shipment reference          |
| rcpt\_name          | String | Name of the recepient                      |
| rcpt\_addr          | String | Adress of the recepient                    |
| rcpt\_city          | String | City of the recepient                      |
| rcpt\_cap           | String | Zip code of the recepient                  |
| rcpt\_prov          | String | Province/country of the recipient          |
| rcpt\_country\_code | String | Country of the recepient (iso code 2 char) |

{% tabs %}
{% tab title="200: OK Parcel successfully removed" %}

```javascript
{
    "id": "50000723",
    "num_spedizione": "7004525883",
    "num_collo": 1
}
```

{% endtab %}

{% tab title="200: OK Last parcel revoval and cancellation of the shipment " %}

```javascript
{
    "result": "Shipment deleted"
}
```

{% endtab %}

{% tab title="403: Forbidden Cancellation of the shipment confirmed" %}

```javascript
{
    "error" : "This shipment is already confirmed"
}
```

{% endtab %}

{% tab title="404 Shipment ID not found" %}

```javascript
{
  "error": "Shipment '1' doesn't exists!"
}
```

{% endtab %}

{% tab title="404: Not Found Unable to find unique shipment via recepient data" %}

```javascript
{
  "error": "Unable to find unique shipment by ddt and address"
}
```

{% endtab %}
{% endtabs %}

### Example Snippet Parcels DELETE

{% tabs %}
{% tab title="PHP" %}

```php
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.gsped.it/sandbox/Parcels",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_POSTFIELDS => "id_sped=69562763",
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/x-www-form-urlencoded",
    "x-api-key: YOUR-API-KEY"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
```

{% endtab %}

{% tab title="Python" %}

```python
import http.client

conn = http.client.HTTPSConnection("api.gsped.it")

payload = "id_sped=69562763"

headers = {
    'Content-Type': "application/x-www-form-urlencoded",
    'x-api-key': "YOUR-API-KEY"
    }

conn.request("DELETE", "/sandbox/Parcels", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
```

{% endtab %}

{% tab title="GO" %}

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.gsped.it/sandbox/Parcels"

	payload := strings.NewReader("id_sped=69562763")

	req, _ := http.NewRequest("DELETE", url, payload)

	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Add("x-api-key", "YOUR-API-KEY")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

{% endtab %}

{% tab title="C#" %}

```csharp
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Delete,
    RequestUri = new Uri("https://api.gsped.it/sandbox/Parcels"),
    Headers =
    {
        { "x-api-key", "YOUR-API-KEY" },
    },
    Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        { "id_sped", "69562763" },
    }),
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}c
```

{% endtab %}

{% tab title="cURL" %}

```bash
curl --request DELETE \
  --url https://api.gsped.it/sandbox/Parcels \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --header 'x-api-key: YOUR-API-KEY' \
  --data id_sped=69562763
```

{% endtab %}
{% endtabs %}

### Notes

When the customer makes a shipment with AddParcel, it is possible to trace back to the original creation date from the label creation dates, which are visible in the designated bucket on S3.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://apidocs.gsped.com/gsped-api-english-version/spedizioni-e-dintorni/add-parcel.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
