curl --request POST \
--url https://api-uat.dimetrades.com/api/partner/webhook-events/replay \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-API-Secret: <api-key>' \
--data '
{
"eventIds": [
"54b1fca5-697c-4b22-937f-e78abb9bb42f"
]
}
'{
"data": {
"replayedCount": 1,
"eventIds": [
"54b1fca5-697c-4b22-937f-e78abb9bb42f"
],
"truncated": false
},
"errors": []
}{
"data": {},
"errors": {
"statusCode": 400,
"error": "RequestValidationError",
"message": "email must match format \"email\"",
"code": 1002,
"explanation": "The request input did not pass validation checks."
}
}{
"data": {},
"errors": {
"statusCode": 401,
"error": "BrandUnauthorized",
"message": "Invalid brand credentials",
"code": 17001,
"explanation": "The X-API-Key / X-API-Secret pair is missing or does not match an active credential."
}
}{
"data": {},
"errors": {
"statusCode": 403,
"error": "BrandInactive",
"message": "Brand is suspended",
"code": 17002,
"explanation": "This brand has been suspended and can no longer make partner API calls."
}
}{
"data": {},
"errors": {
"statusCode": 500,
"error": "InternalError",
"message": "Internal Server Error",
"code": 1003,
"explanation": "An unexpected error occurred on the server, Please try again later."
}
}Request redelivery of webhook events
Requeues webhook events for redelivery — recovers an event that was dead-lettered after 8 failed delivery attempts, or asks for a genuine resend of one you already received but lost. Target the events either by eventIds or by a from/to time range (exactly one of the two); narrow either mode further with eventType.
Only failed and delivered events are eligible — an event still pending or actively delivering is left alone rather than raced against its own in-flight attempt. A matched event is reset to pending and picked up by the normal delivery worker within seconds; this call itself only queues the redelivery; it does not wait for it to land.
Redelivering an already-delivered event re-sends it with the same X-DimeTrades-Event-Id. Your webhook receiver should already dedupe on that id for ordinary at-least-once retries — this is the same case, not a new one.
At most 500 events are requeued per call. truncated: true means more events matched than that — narrow the range (or page by createdAt using the last replayed event as your new from) and call again.
Server-to-server only. All /partner/* endpoints are authenticated with your brand credentials — X-API-Key + X-API-Secret headers — not with an end-user bearer token. Only events belonging to your own brand can ever be matched.
curl --request POST \
--url https://api-uat.dimetrades.com/api/partner/webhook-events/replay \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-API-Secret: <api-key>' \
--data '
{
"eventIds": [
"54b1fca5-697c-4b22-937f-e78abb9bb42f"
]
}
'{
"data": {
"replayedCount": 1,
"eventIds": [
"54b1fca5-697c-4b22-937f-e78abb9bb42f"
],
"truncated": false
},
"errors": []
}{
"data": {},
"errors": {
"statusCode": 400,
"error": "RequestValidationError",
"message": "email must match format \"email\"",
"code": 1002,
"explanation": "The request input did not pass validation checks."
}
}{
"data": {},
"errors": {
"statusCode": 401,
"error": "BrandUnauthorized",
"message": "Invalid brand credentials",
"code": 17001,
"explanation": "The X-API-Key / X-API-Secret pair is missing or does not match an active credential."
}
}{
"data": {},
"errors": {
"statusCode": 403,
"error": "BrandInactive",
"message": "Brand is suspended",
"code": 17002,
"explanation": "This brand has been suspended and can no longer make partner API calls."
}
}{
"data": {},
"errors": {
"statusCode": 500,
"error": "InternalError",
"message": "Internal Server Error",
"code": 1003,
"explanation": "An unexpected error occurred on the server, Please try again later."
}
}Authorizations
ISV / partner credential — public half. Required on every request.
Identifies the integration partner (ISV) making the call. Issued by Dime
Trades when the ISV is onboarded and sent on every /partner/* endpoint:
X-API-Key: dt_pk_live_7f3c9a2e5b18
- On the two partner endpoints that create accounts or issue tokens (
POST /partner/customers,POST /partner/customers/login), it is accompanied byX-API-Secretand is the only authentication — there is no user token yet. - On every other partner endpoint it is sent alongside the user's
Authorization: Bearer <token>: the API key says which platform is calling, the bearer token says which user it is calling for.
Credentials are scoped to one or more brands; using a key with a brandId outside that scope returns 403. Staging and production keys are separate.
The key identifies your platform — treat it as a backend credential.
ISV / partner credential — secret half. Sent on every /partner/* endpoint.
The confidential counterpart to X-API-Key. It is required, together with the key, on every /partner/* endpoint: register, login, refresh-token, logout, kyc, wallet-instructions and the replay endpoints. Outside /partner/* — the ordinary user API, called with a user's bearer token — the key is sent without the secret.
X-API-Key: dt_pk_live_7f3c9a2e5b18
X-API-Secret: dt_sk_live_9d41ba07c6e2f85a3b7c1049de26f8b1
A request to a /partner/* endpoint that has a key without its matching secret is rejected with 401. The secret is shown once at issue time and stored only as a hash on our side — if it is lost or exposed, rotate the pair from the partner console rather than asking for a copy. Never ship it in a browser or mobile client: anyone holding it can mint a token for any of your users.
Body
Specific webhook event ids to redeliver (the same id as X-DimeTrades-Event-Id / GET /partner/wallet-instructions's webhookEventId). Mutually exclusive with from/to.
1 - 500 elementsStart of the createdAt range to redeliver (inclusive). Requires to; mutually exclusive with eventIds.
End of the createdAt range to redeliver (inclusive). Requires from; mutually exclusive with eventIds.
Optional narrowing to one event type (e.g. order.filled, wallet.debit), applied on top of either eventIds or the time range.
"wallet.debit"
