Method GET/partner/mint/batch/status/{job_id}

Reads the progress of a batch of products sent for minting, from the identifier returned at the moment of the submission.

On this page

You follow the progress of a batch sent for minting, and you know when to stop your loop. Poll this endpoint as many times as needed: it neither creates nor modifies any product, and it consumes no daily quota. Read the warning below before concluding, from this read, that your items exist.

The server exposes two addresses that call the same code: /v1/partner/mint/batch/status/{job_id} and /partner/mint/batch/status/{job_id}. Use the /v1 form for any new integration.

#Authorization

Scope required on the key: mint:batch.

It is the same scope as the submission of a batch. A key that does not have that scope receives 403, and the message names the missing scope.

Authenticate through the Authorization header, in the Bearer format.

HTTP
Authorization: Bearer votre_clef

Only a key of the brand that submitted the batch can read it.

#Rate limit

The rate limit of the partner API applies to this endpoint, over a fixed window of 60 seconds.

Two counters run at the same time, one for your key, one for the sum of the keys of your brand. The limit applied comes from a value set on your account, or failing that from your plan. When neither of the two is defined, it is 120 calls per window.

Do not guess that value. Every response that has cleared the rate check carries four headers that give it. A 401 response, an authentication 403 or a 503 arrive before or during that check, and do not carry them.

HeaderWhat it contains
X-RateLimit-Limitthe applicable limit, in calls per window
X-RateLimit-Remainingwhat is left to you in the current window
X-RateLimit-Resetthe timestamp, in seconds since 1970, at which the window starts over
X-RateLimit-Scopekey or brand, depending on which of the two counters is the more constraining

This endpoint consumes no unit of your daily quota, and no unit of the monthly product quota of your plan.

#Path and query parameters

NameTypeRequiredDescription
job_idstringyesThe batch identifier returned by the submission of the batch, in the job_id field of its response. Put it in the path of the address.

This endpoint accepts no query parameter.

#Request body

None. This is a read, it has no body.

#Example request

curl -sS https://api.sealtrust.io/v1/partner/mint/batch/status/0000a1b2c3d4e5f6 \
  -H "Authorization: Bearer st_test_0000000000000000000000000000000000000000000000"

#Example response

HTTP status code 200, for a batch of 500 rows being processed, twelve rows of which have already succeeded.

200 OK
{
  "job_id": "0000a1b2c3d4e5f6",
  "status": "started",
  "is_finished": false,
  "batch_status": "pending",
  "items_count": 500,
  "success_count": 12,
  "error_count": 0,
  "enqueued_at": "2026-08-20T09:14:32.118431+00:00",
  "started_at": "2026-08-20T09:14:33.402118+00:00",
  "ended_at": null,
  "result": null,
  "exc_info": null
}

The twelve keys are always present in this shape of response. Only their values change. The counters are there from your first call: each row of the batch is counted at the moment it succeeds. When the processing of the batch reaches its end, is_finished turns true and ended_at carries a date. That tells you that the processing went all the way through. To know how many items were created, read success_count.

FieldTypeDescription
job_idstringThe identifier you asked for, taken up as it is.
statusstringThe progress of the processing of the batch. The values are detailed below.
is_finishedbooleanTrue when the processing of the batch is over. A batch that answers status: "failed" can carry either value. Steer your loop on status.
batch_statusstring or nullThe state of the batch itself. The values are detailed below.
items_countinteger or nullThe number of rows of the batch.
success_countinteger or nullThe number of items actually created as of the moment of your read, counted row by row.
error_countinteger or nullThe number of rows actually failed as of the moment of your read, counted row by row.
enqueued_atstring or nullDate and time at which the batch was accepted and queued for processing.
started_atstring or nullDate and time of the start of the processing. Null as long as it has not started.
ended_atstring or nullDate and time of the end of the processing. Null as long as it is not over.

The three dates carry the +00:00 offset: they follow universal time.

The response carries two more fields, result and exc_info. They are internal to our processing. Ignore them: do not display them, do not store them, do not wire any logic to them. Neither of the two tells you how many items were created.

#The values of status

ValueWhat it means
queuedthe batch is waiting its turn
startedthe batch is being processed
finishedthe batch went all the way through, whatever the number of items created
failedthe processing stopped on a failure. Rows may have succeeded all the same: read success_count
unknownno batch reachable with this key matches this identifier

Values other than these five can appear. The types of the TypeScript SDK declare four more: deferred, scheduled, stopped and canceled. Write your loop so that it handles an unexpected value without crashing.

Loop as long as the status is queued or started. Stop on finished, on failed and on unknown. Stopping your loop tells you nothing about the number of items created: that number is read in success_count.

#The values of batch_status

A batch submitted through this API starts at pending. Only its processing makes it change, to retrying, to pending_multisig, or to a terminal state, success, partial or failed. The running value does not appear on this path: do not write a branch for it. partial means that only part of the items were created. Compare success_count and items_count in that case.

#The response when no reachable batch matches

When no batch reachable with your key matches the identifier, you receive 200, with two fields and nothing else.

200 OK
{
  "job_id": "0000a1b2c3d4e5f6",
  "status": "unknown"
}

#The second shape of response, on an old batch

We only keep the detail of how the processing went for a time. Past that delay, the response takes a second shape, built from the state of the batch itself. It carries the first seven fields and nothing else: neither the three dates, nor the two internal fields. The counters, for their part, are in both shapes. Handle both shapes.

200 OK
{
  "job_id": "0000a1b2c3d4e5f6",
  "status": "failed",
  "is_finished": true,
  "batch_status": "failed",
  "items_count": 500,
  "success_count": 0,
  "error_count": 500
}

It can carry any status, including queued and started. Do not deduce from its shape that the batch is over.

In this shape of response, is_finished is true for success, partial and failed, and status comes from the state of the batch. A batch every row of which was rejected answers status: "failed" and is_finished: true here, and the first shape answers the same thing for the same run. Do not compare two reads made at different moments to deduce that the batch has changed state. The number of items created is read in success_count.

#Errors

CodeConditionWhat to do
401the Authorization header is absentadd it, the response also carries WWW-Authenticate: Bearer
401the header does not start with Bearer followed by a spacecorrect the shape of the header, the response also carries WWW-Authenticate: Bearer
401the value sent after Bearer is shorter than 40 characterssend the complete secret, this response does not carry WWW-Authenticate
401the value sent is not a known keycheck that you are copying the whole secret, without a space or a line break
403the key has been revoked, the message gives its statecreate a new key from the console of your brand
403the key has reached its expiry datecreate a new key, the old one will never become valid again
403the key does not have the mint:batch scope, the message names itcreate a key carrying that scope, it also governs the submission of a batch
403you do not have access to this batchcheck that you are polling the right identifier with the key of the right brand
429your key has gone over its own rate limitwait the number of seconds indicated by Retry-After, then try again. X-RateLimit-Scope is then key
429all the keys of your brand together have gone over the limit of the brandwait the number of seconds indicated by Retry-After, then try again. X-RateLimit-Scope is then brand. Adding keys does not raise that limit
500an unexpected internal errortry again. If the refusal repeats, write to us giving the value of the X-Request-Id header of the response
503the service that holds the rate counters is momentarily unavailablethe call read nothing. Try again later

No error code in this list depends on the content of the batch. The check for the refusals tied to the batch itself, size, columns, categories and the quota of your plan, takes place at the moment of the submission, on POST /v1/partner/mint/batch.

#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