Method GET/partner/webhooks

List the notification subscriptions recorded in your brand's name, page by page. Requires the webhooks:read right.

On this page

By the end of this page, you will know how to list the notification subscriptions recorded in your brand's name and to walk through that list page by page.

Full address:

HTTP
GET https://api.sealtrust.io/v1/partner/webhooks

The same endpoint also answers without the /v1 prefix, at https://api.sealtrust.io/partner/webhooks. Both addresses call the same code. Use the /v1 form for a new integration.

#Authorization

API key in the Authorization header, in Bearer format, carrying the webhooks:read right. A key that does not carry that right receives a 403 whose message names the missing right.

A key belongs to a single brand. This list therefore contains only the subscriptions of the key's brand, and no other.

This read stays open whatever your plan. If your plan no longer includes notifications, you keep seeing which reception points are recorded in your name. It is creation and modification that require the plan.

#Call limit

Throughput is measured over a fixed 60 second window. The value applied is the one of your plan, or the one set on your account if we have set one. In the absence of both, the fallback value is 120 calls per window.

Two counters stack, with the same ceiling: one per key, one for the sum of all your brand's keys. Creating additional keys therefore does not increase the total allowed throughput.

The limit is checked before the key right check and before any database read. A call refused with a 403 for a missing right has therefore already consumed one unit of the current window's budget.

A 200 response carries four headers, which describe the more constraining counter of the two.

HeaderContent
X-RateLimit-Limitthe ceiling applied over the window
X-RateLimit-Remainingwhat is left to you in the current window
X-RateLimit-Resetthe timestamp of the end of the window, in seconds
X-RateLimit-Scopekey or brand, the counter that served as the reference

These four headers accompany the 200 response and the 429 response. On the other response codes, do not expect them: a key that is absent, unknown, revoked or expired is refused before any counting, and the other refusals do not report these values.

A refusal returns 429 with Retry-After, expressed in seconds remaining in the current window. That value is never lower than 1.

#Path and query parameters

This endpoint has no path parameter.

NameTypeRequiredDescription
skipintegernoThe number of subscriptions to skip before starting the page. Is 0 by default. A negative value is refused with a 422.
limitintegernoThe maximum number of subscriptions to return. Is 20 by default. The minimum is 1, the maximum is 100. A value outside these bounds is refused with a 422, with no silent truncation.

#Headers

NameTypeRequiredDescription
AuthorizationstringyesBearer followed by your API key.

#Request body

This endpoint has no request body. All the information you send fits in the two query parameters above.

#Example request

The first page, twenty subscriptions at most.

curl -i -X GET "https://api.sealtrust.io/v1/partner/webhooks?skip=0&limit=20" \
  -H "Authorization: Bearer st_test_0000000000000000000000000000000000000000000000"

To read the next page, raise skip by the value of limit: skip=20 with limit=20, then skip=40, and so on until items is empty. The total field gives you the number of subscriptions to walk through.

#Example response

HTTP code 200.

JSON
{
  "items": [
    {
      "id": 41,
      "url": "https://exemple.test/sealtrust/evenements",
      "event_types": [
        "product.minted",
        "batch.completed",
        "batch.failed"
      ],
      "brand_id": 12,
      "is_active": true,
      "health": "healthy",
      "created_at": "2026-08-18T09:14:02.117043+00:00",
      "updated_at": "2026-08-18T09:14:02.117043+00:00"
    },
    {
      "id": 39,
      "url": "https://exemple.test/sealtrust/retours",
      "event_types": [
        "return.requested",
        "return.completed"
      ],
      "brand_id": 12,
      "is_active": false,
      "health": "degraded",
      "created_at": "2026-08-11T16:40:55.902881+00:00",
      "updated_at": "2026-08-19T07:02:31.448190+00:00"
    }
  ],
  "total": 2
}

The list is paginated, and sorted on the creation date, from the most recent to the oldest.

The response has two fields and nothing else.

FieldTypeDescription
itemsarrayThe subscriptions of the page, from the most recent to the oldest.
totalintegerThe total number of subscriptions of your brand, across all pages, active as well as turned off.

Each entry of items has eight fields.

FieldTypeDescription
idintegerThe identifier of the subscription. Pass it in the path of GET /v1/partner/webhooks/{webhook_id}, of PUT /v1/partner/webhooks/{webhook_id} and of DELETE /v1/partner/webhooks/{webhook_id}.
urlstringThe address that receives the deliveries. It always starts with https://.
event_typesarrayThe event types this subscription is registered for. An empty list means that no event will be delivered.
brand_idintegerThe number of your brand. It is identical on every entry.
is_activebooleanfalse when the subscription is turned off.
healthstringhealthy or degraded. See below.
created_atstringThe creation date of the subscription, in ISO 8601 format with time zone.
updated_atstringThe date of the last modification, in ISO 8601 format with time zone.

health is healthy at creation. It moves to degraded when we give up the delivery attempts on that address. It goes back to healthy on the first successful delivery that follows.

The signing secret of a subscription is never returned by this list, nor by any other read endpoint.

#Errors

The body of an error response carries a detail field. Depending on the case, that field contains a sentence or a list.

CodeConditionWhat to do
401The Authorization header is absent. The response also carries WWW-Authenticate: Bearer.Add the header.
401The Authorization header does not start with Bearer followed by a space. The response also carries WWW-Authenticate: Bearer.Correct the form of the header.
401The key sent is empty or has fewer than 40 characters. detail is Invalid API key format. This response does not carry WWW-Authenticate.Send the complete secret, with no space and no line break.
401The key sent is unknown. detail is Invalid API key.Check that you are using the right key, and that it has not been replaced.
403The key is no longer active, because it has been revoked. The message gives its state.Create a new key in the console.
403The key has reached its expiration date.Create a new key. The old one will never become valid again.
403The key does not carry the webhooks:read right. The message names the missing right.Create a key carrying that right. The rights of an existing key cannot be modified.
422skip is negative, limit is lower than 1 or greater than 100, or one of the two values is not an integer. detail is a list that names the faulty parameter.Correct the value. The upper bound of limit is 100.
422A pagination value exceeds what the database accepts as an integer. The message is generic and does not name the parameter. The response carries an X-Request-Id header.Reduce skip. Normal pagination stays far below that bound.
429The throughput limit of the key is reached. The Retry-After header and the X-RateLimit-* family accompany the response, with X-RateLimit-Scope: key.Wait the number of seconds indicated by Retry-After, then try again.
429The throughput limit of the brand is reached, all keys taken together. X-RateLimit-Scope is brand.Wait the number of seconds indicated by Retry-After. Creating an additional key does not raise that ceiling.
500An unexpected error occurred while handling your call. The body is {"detail": "Internal Server Error"} and the response carries an X-Request-Id header.Try again. If the error persists, contact support giving the value of X-Request-Id.
503The service that keeps the throughput counters is momentarily unavailable. The call is refused without being counted.Try again in a few moments. No data was read or modified.

This endpoint never returns 404. A brand with no subscription at all receives a 200 with an empty items and total at 0.

#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