Method GET/passport/01/{gtin}/10/{lot}

Read the digital passport published for a production batch, from the GTIN of its model and the lot number. No API key for the public tier.

On this page

You read the digital passport published for a production batch. The batch is designated by the GTIN of its model and by its lot number, as in its GS1 Digital Link. When you leave this page, you will know how to fetch the content of the batch's passport, how to recognise that it is a batch, and why this address never falls back on the model.

Full address:

HTTP
GET https://api.sealtrust.io/v1/passport/01/{gtin}/10/{lot}

The same endpoint also answers without the /v1 prefix. Use the /v1 form for a new integration.

#Authorization

None for the public tier, which is the default tier. The access tiers and the accounts that obtain them are exactly those of GET /passport/01/{gtin}: the same check applies to both addresses, through the same code.

#Rate limit

600 calls per window of 60 seconds, counted per calling IP address. This counter is shared by every read (GET) whose address starts with /passport.

#Path and query parameters

NameTypeRequiredDescription
gtinstringyesThe GTIN of the batch's model, brought to fourteen digits before the search. Its check digit is verified.
lotstringyesThe lot number, compared exactly, case included. Encode the characters that need it.
access_tierstringnoThe access tier: public by default. Same values as for a model's passport.

#Request body

None. This request has no body.

#Example request

Reading the passport of batch LOT-26A of GTIN 03701234567891, at the public tier.

curl -i "https://api.sealtrust.io/v1/passport/01/03701234567891/10/LOT-26A"

#Example response

HTTP code 200.

JSON
{
  "id": 412,
  "product_id": null,
  "product_model_id": 7,
  "gtin": "03701234567891",
  "level": "batch",
  "brand_id": 3,
  "brand_code": "K7Q2M9XH4B",
  "schema_version": "1.0",
  "passport_version": 2,
  "data": {
    "product_identity": {
      "gtin": "03701234567891",
      "batch_or_serial_identifier": "LOT-26A",
      "production_facility": "Atelier de Porto",
      "made_in": "PT"
    }
  },
  "data_hash": "9f2c1e7d4b8a6f0e3d5c2b1a9e8f7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e",
  "ipfs_uri": null,
  "visibility": "public",
  "published_at": "2026-09-26T08:00:00+00:00",
  "product_name": "T-shirt coton",
  "brand_name": "Atelier",
  "image_url": "https://atelier.test/images/cotton-t-shirt.jpg",
  "product_batch_id": 11,
  "batch_code": "LOT-26A"
}

Every value in this example is fictitious.

FieldTypeDescription
levelstringAlways batch here. A model's passport carries model.
product_idintegerAlways null: a batch passport is attached to no item.
product_model_idintegerThe model of the batch, reached through the batch.
product_batch_idintegerThe batch this passport is attached to.
batch_codestringThe lot number, as it appears in the GS1 link.
gtinstringThe model's GTIN, in its fourteen digit form.
image_urlstring | nullThe photograph of the lot's model, computed as on the model's passport. null when the model has none, or when it belongs to a brand other than this passport's. It is the light copy of the photo (WebP, 800 pixels at most on the long side, 100 KB at most, no EXIF data) when it exists, else the original. An address of another site is returned as given.
dataobjectThe content of the passport, filtered by access tier.
ipfs_uristringThe address of the IPFS copy, returned only at the authenticated tiers, as for the model.
access_tierstringThe tier actually served: the one asked for, or public by default.
available_tiersarray of stringThe tiers YOUR call may ask for on this passport, in the order public, end_user, repairer, recycler, upstream, authority: ["public"] without authentication, end_user added for a signed-in account, the trade the brand accredited for a partner, all of them for an authority. The list grants nothing: every tier asked is still checked. A response carrying it for a signed-in account must go to no shared cache.
passport_service_providerobject or nullThe passport service provider keeping the back-up copy of this version (Regulation (EU) 2024/1781, article 10(4) and Annex III point (l)): identifier, its reference, name, its legal name, and backed_up_at, the date of the copy in ISO 8601 format. null until the copy of this version exists, or when its last check failed. Outside data, so outside the data_hash fingerprint.

The other fields have the same meaning as in the response of GET /passport/01/{gtin}.

#Errors

CodeConditionWhat to do
400The GTIN check digit does not match.Copy the GTIN again from the barcode.
401A tier that requires an account, requested without a session.Sign in, or request the public tier.
403A tier your account does not open for this brand.Request a tier your account is entitled to.
404No published and public passport for this batch, a batch of another brand than the one of the called domain, or a batch of another brand than the one that publishes the model passport of this GTIN.Check the lot number, case included, and the publication in the console.
429More than 600 calls in 60 seconds from the same IP address.Wait the number of seconds given by Retry-After.

#See also

Your answer opens a pre-filled email in your mail app, addressed to contact@sealtrust.io. You read it over before sending it.

Suggest a correctionReport a problem