---
updatedAt: 2025-11-12T22:15:39.000Z
agentTools:
  projectIndex: https://docs.nmp.arianee.com/llms.txt
---

# TimestampDPP

## Before you begin

As a brand or service provider, you want to **timestamp an Arianee Event** on a **Digital Product Passport (DPP)**.\
The `timestampDPP` API provides a **single entry point** for timestamping, without worrying if the DPP is already minted or needs to be created.

**Use case examples:**

* A repair service is completed, you want to timestamp the intervention.
* A warranty extension is granted, you want to attach it as an event to the product.
* A product is inspected or transferred, and you want to keep a trace in its passport history.

## 🎯 Objective

Simplify timestamping by exposing **one unique API** that:

* Identifies the right DPP from:
  * a **QR code** (Smart Link, Arianee Link, or other data carrier),
  * one or multtiple **photos of the product’s data plate** (nameplate),
  * or **manual identifiers**.
* Associates an **Arianee Event** with the DPP.
* Creates missing parent DPPs if necessary.

***

## 📡 API Request

### Example `curl`

```bash
curl --location 'https://url.nmp.arianee.com/certificate/timestamp' \
--header 'x-api-key: ••••••' \
--form 'photo=@"/Users/nameofuser/Downloads/plaquesignalétique.pdf"' \
--form 'arianeeEventTemplate="{ \"id\": \"67bee46014f957ee9baa0f33\", \"data\": {\"duration\":\"14 jours\"} }"' \
--form 'qrcode="https://app.arianee.com/33996814,soi29jo1mwlj,testnet"'

 
```

***

## 📝 Fields

### `photo` *DEPRECATED*

* Use "photos" instead. Still working for retro-compatibility.
* **Type:** image file
* **Required:** No (exclusive with `identifiers`)
* **Description:** A photo of the data plate.

  * Processed by AI to extract identifiers like `serialNumber` or `refTech`.

***

### `photos`

* **Type:** images file
* **Required:** No (exclusive with `identifiers`)
* **Description:** Multiple photos of the data plate.

  * Processed by AI to extract identifiers like `serialNumber` or `refTech`.

***

### `qrcode`

* **Type:** `string`
* **Required:** No
* **Description:** A link scanned from a QR code. Can be:

  * Direct Arianee Link (`https://wallet.arianee.org/passport/...`)
  * Smart Link (`https://q.arianee.net/...`)
  * Third-party redirect

**Behavior:**

* If the link points to an existing DPP → used directly.
* If not, but a DPP is created from `photo` or `identifiers` **and** the link is a Smart Link → the Smart Link is paired automatically with the new DPP.

***

### `arianeeEventTemplate`

* **Type:** JSON string
* **Required:** ✅ Yes
* **Description:** Event template to create.

  * `id`: template ID in Arianee NMP
  * `data`: dynamic fields (e.g., `duration`, `description`)

**Example:**

```json
{
  "id": "67bee46014f957ee9baa0f33",
  "data": {
    "duration": "14 jours",
    "description": "Révision complète du produit"
  }
}
```

***

### `identifiers`

* **Type:** JSON string
* **Required:** No (exclusive with `photo`)
* **Description:** Data extracted manually from the data plate.

Possible fields:

* `serialNumber` (required if no photo)
* `commercialReference`
* `productGroupId` (codic, etc.)
* `gtin`
* `manufacturer` (only for parent creation)

***

## 🛑 API Error Codes

All processes run in a background job.\
The API always returns **200**, except for the following errors:

| Code | Error                                    | Message                                    | Trigger                               |
| ---- | ---------------------------------------- | ------------------------------------------ | ------------------------------------- |
| 400  | `multiple.photos`                        | Only one photo is allowed                  | More than one photo uploaded          |
| 400  | `invalid.photo.type`                     | Photo must be an image file                | File is not `image/*`                 |
| 400  | `photo.too.large`                        | Photo must not exceed 5MB                  | File > 5MB                            |
| 400  | `missing.photo.or.qrcode.or.identifiers` | photo or qrcode or identifiers is required | None of the three fields present      |
| 400  | `missing.arianeeEventTemplate`           | arianeeEventTemplate.id is required        | Event template missing/invalid        |
| 400  | `missing.identifiers`                    | identifiers required                       | No identifiers provided when no photo |
| 400  | `missing.serialNumber`                   | serialNumber required                      | Missing serialNumber with no photo    |
| 400  | `invalid.qrcode`                         | qrcode must be valid URL                   | Invalid or non-URL string             |
| 400  | `arianeeEventTemplate.notfound`          | Event template not found                   | Template ID not in DB                 |
| 400  | `arianeeEventTemplate.invalidId`         | Invalid MongoDB ObjectId                   | Wrong template ID format              |
| 500  | `upload.error`                           | Upload error                               | Failure uploading to GCS              |
| 500  | `Error processing timestampDPP`          | Unexpected error                           | Main try/catch failed                 |

***

## ⚙️ Use Cases

### Case 1: QR Code only

```json
{
  "qrcode": "https://q.arianee.net/...",
  "arianeeEventTemplate": { ... }
}
```

* Follows redirect to find DPP.
* ✅ If found → Event applied.
* ❌ If not → Error.

***

### Case 2: Photo or Identifiers only

```json
{
  "photo": fichier,
  "arianeeEventTemplate": { ... }
}
```

```json
{
  "identifiers": {
    "serialNumber": "12345",
    "refCom": "ABC-123"
  },
  "arianeeEventTemplate": { ... }
}
```

* Identifiers extracted or provided manually.
* ✅ If unit DPP exists → Event applied.
* ❌ If not:

  * Looks for parent DPP.
  * If none → creates minimal parent.
  * Creates unit DPP.
  * Applies Event.

***

### Case 3: Photo + QR Code

* If QR code = Arianee Link → **prioritized**.
* If QR code = Smart Link but unpaired:

  * Falls back to identifiers/photo.
  * Creates DPP if needed.
  * Pairs Smart Link ↔ DPP.
  * Applies Event.

***

### Summary of Cases

| Case | Inputs                            | DPP Found?           | Action                                               |
| ---- | --------------------------------- | -------------------- | ---------------------------------------------------- |
| 1    | `qrcode` (Arianee Link)           | ✅ yes                | Event applied                                        |
|      |                                   | ❌ no                 | Error                                                |
| 2    | `photo` or `identifiers`          | ✅ yes                | Event applied                                        |
|      |                                   | ❌ no + parent exists | Create unit DPP + Event                              |
|      |                                   | ❌ no + no parent     | Create parent + unit + Event                         |
| 3    | `photo` + `qrcode` (Smart Link)   | ❌ via QR             | Create unit DPP from photo + pair Smart Link + Event |
| 3b   | `photo` + `qrcode` (Arianee Link) | ✅ yes                | Event applied (photo ignored)                        |

***

## 🔍 Examples

### Example 1: QR code random + identifiers match a DPP

```json
{
  "qrcode": "https://google.com/random-link",
  "identifiers": {
    "serialNumber": "123456",
    "technicalReference": "ABC-987"
  }
}
```

**Behavior:**

1. QR code not Arianee → no DPP found.
2. Fallback to identifiers.
3. ✅ Unit DPP exists → Event applied.
4. ❌ No Smart Link association (since QR is not Arianee).

***

### Example 2: Arianee Link + conflicting identifiers

```json
{
  "qrcode": "https://wallet.arianee.org/passport/brand/12345,abc",
  "identifiers": {
    "serialNumber": "999999"
  }
}
```

**Behavior:**

* QR code → identifies an existing DPP.
* Identifiers point to a different one.
* ✅ QR code takes priority. Event applied to QR code DPP.
* Optional: log mismatch warning.

***

### Example 3: Smart Link unpaired + identifiers not found

```json
{
  "qrcode": "https://q.arianee.net/abc-uuid-smartlink",
  "identifiers": {
    "serialNumber": "000000"
  }
}
```

**Behavior:**

1. Smart Link not paired → no DPP found.
2. Identifiers don’t match any DPP.
3. ❌ No parent → create minimal parent.
4. ✅ Create new unit DPP.
5. Pair Smart Link ↔ DPP.
6. Apply Event.