Many parts of Polymart require JavaScript to function correctly.
Click here to enable JavaScript.

Webhooks

Back to Wiki Home
You can edit webhooks on your resource by going to your resource page and clicking the "Webhooks" button in the edit section.

Automatic Discord Integration
Polymart automatically integrates with Discord webhooks. However, this doesn't give you nearly as much customization as if you build your own API for receiving webhooks. If you want to learn more about how to build your own API for receiving webhooks, keep reading!

Webhook Overview
ping — Sent whenever you click the "ping" button on your resource's webhooks page

product.update — Sent whenever you post an update to your resource
product.user.purchase — Sent when a user purchases your resource
product.user.purchaseRemoved — Sent when a user issues a chargeback or is refunded
product.user.firstDownload — Sent when a user first downloads your resource

About Webhooks
When a webhook event is called, Polymart will send a request to the URL you provide on your resource page. With each request, the following headers will be sent:

X-Polymart-Webhook-Version: 1

X-Polymart-Signature will be a signature that verifies that the webhook request is in-fact valid. This is a SHA256 HMAC hash, where the data is the data that was POSTed, and the key is your webhook secret. Your webhook secret generated when you create a new webhook. YOU MUST VALIDATE THAT THIS IS CORRECT. If you do not, attackers will easily be able to send random, invalid webhooks to your server

The data that is POSTed to your webhook will be in this format
{
  "event": <event type>,
  "time": <current unix time>,
  "nonce": <random nonce>,
  "payload": {
    <key 1>: <val 1>,
    <key 2>: <val 2>,
    <...>: <...>
  }
}
So, the top-level information might look something like this
{
  "event": "product.update",
  "time": 1627801120,
  "nonce": "EsGy9SpfI0cvZSZE",
  "payload": <...>
}
Putting it all together, this is what a full valid request to https://example.com/polymartWebhook might look like, given the webhook secret 55tcz_Hm0J7CoPNP
POST /polymartWebhook HTTP/1.1
X-Polymart-Webhook-Version: 1
X-Polymart-Signature: 1b478355ca95ddaefa5214c99a8bcdc49478ccdd472e696ffec4a8ce2a162791
Content-Type: application/json
Content-Length: 166

{
    "event": "testEvent",
    "time": 1627801120,
    "nonce": "YR6KkzjSRjSoRNA0",
    "payload": {
        "webhook": "https://example.com/polymartWebhook"
    }
}
Use this to test your webhook! This webhook event is called when you click the "send a ping" button on your resource's webhooks page.

Format
{
  "event": "ping",
  "time": <current unix time>,
  "nonce": <random nonce>,
  "payload": {
    "product": {
      "id": <resource id>,
      "title": <resource title>,
      "subtitle": <resource subtitle>,
      "url": <resource url>
    },
    "webhook": {
      "url": <your webhook url>
    }
  }
}
Example
{
  "event": "ping",
  "time": 1627801120,
  "nonce": "ppmV35RHXC7CEu3g",
  "payload": {
    "product": {
      "id": "1",
      "title": "CustomItems",
      "subtitle": "Design new Custom items and blocks!",
      "url": "https://polymart.org/resource/1"
    },
    "webhook": {
      "url": "https://example.com/polymartWebhook"
    }
  }
}

If your webhook secret is 55tcz_Hm0J7CoPNP, then the signature of this request will be 4d4c625edef3f8aac3e35343fa5f338ded0fd0634053219b59d9f4a63d005f4f
product.update Back to top
This webhook event is called when your resource is updated.

Format
{
  "event": "resource.update",
  "time": <current unix time>,
  "nonce": <random nonce>,
  "payload": {
    "product": {
      "id": <resource id>,
      "title": <resource title>,
      "subtitle": <resource subtitle>,
      "url": <resource url>
    },
    "previous": {
      "version": <old version>,
      "id": <old version ID>,
      "time": <old version update time>,
      "size": <old size>,
      "fileType": <old file type>,
      "branch": <beta|snapshot|release>
    },
    "update": {
      "version": <new version>,
      "id": <new version ID>,
      "time": <update time>,
      "size": <new size>,
      "fileType": <new file type>,
      "branch": <beta|snapshot|release>,
      "title": <update title>,
      "description": <update description>
    }
  }
}
Example
{
  "event": "product.update",
  "time": 1627801120,
  "nonce": "IKo_Jyk3-tvBHYOC",
  "payload": {
    "product": {
      "id": "1",
      "title": "CustomItems",
      "subtitle": "Design new Custom items and blocks!",
      "url": "https://polymart.org/resource/1"
    },
    "previous": {
      "version": "2.19.5",
      "id": "91",
      "time": 1627797520,
      "size": "716624",
      "fileType": "jar",
      "branch": "snapshot"
    },
    "update": {
      "version": "3.0",
      "id": "107",
      "time": 1627801120,
      "size": "718232",
      "fileType": "jar",
      "branch": "release",
      "title": "Automatic Resource Pack Generation",
      "description": "This version adds an automatic resource pack generator to CustomItems!"
    }
  }
}

If your webhook secret is 55tcz_Hm0J7CoPNP, then the signature of this request will be 721d6c00334beacb32b3ccd9f31a10b4e6d9cbf48ced5e3ec804d5c7c2648e2f
product.user.purchase Back to top
This webhook event is called when a user purchases your resource

Format
{
  "event": "product.user.purchase",
  "time": <current unix time>,
  "nonce": <random nonce>,
  "payload": {
    "product": {
      "id": <resource id>,
      "title": <resource title>,
      "subtitle": <resource subtitle>,
      "url": <resource url>
    },
    "user": {
      "id": <user id>
    }
  }
}
Example
{
  "event": "product.user.purchase",
  "time": 1627801120,
  "nonce": "lS-p5fa3WyFEWUtg",
  "payload": {
    "product": {
      "id": "1",
      "title": "CustomItems",
      "subtitle": "Design new Custom items and blocks!",
      "url": "https://polymart.org/resource/1"
    },
    "user": {
      "id": 57685
    }
  }
}

If your webhook secret is 55tcz_Hm0J7CoPNP, then the signature of this request will be e48fa69ffa25bd93c6e34f4fe21bd37b337d02ea5f12f57b24044390e6701f22
product.user.purchaseRemoved Back to top
This webhook event is called when you issue a refund to a user, or they issue a chargeback. This event may be called more than once for a given user

Format
{
  "event": "product.user.purchaseRemoved",
  "time": <current unix time>,
  "nonce": <random nonce>,
  "payload": {
    "product": {
      "id": <resource id>,
      "title": <resource title>,
      "subtitle": <resource subtitle>,
      "url": <resource url>
    },
    "user": {
      "id": <user id>
    }
  }
}
Example
{
  "event": "product.user.purchaseRemoved",
  "time": 1627801120,
  "nonce": "o-T3JFci137FmKe6",
  "payload": {
    "product": {
      "id": "1",
      "title": "CustomItems",
      "subtitle": "Design new Custom items and blocks!",
      "url": "https://polymart.org/resource/1"
    },
    "user": {
      "id": 34781
    }
  }
}

If your webhook secret is 55tcz_Hm0J7CoPNP, then the signature of this request will be 883b78e0244855274fc1cb0aad8e9e32cc9bc3c6e180bfb17922301066d00014
product.user.firstDownload Back to top
This webhook event is called when a user downloads your resource for the first time

Format
{
  "event": "product.user.firstDownload",
  "time": <current unix time>,
  "nonce": <random nonce>,
  "payload": {
    "product": {
      "id": <resource id>,
      "title": <resource title>,
      "subtitle": <resource subtitle>,
      "url": <resource url>
    },
    "user": {
      "id": <user id>
    }
  }
}
Example
{
  "event": "product.user.firstDownload",
  "time": 1627801120,
  "nonce": "4nyY8-RP_e6VKo_M",
  "payload": {
    "product": {
      "id": "1",
      "title": "CustomItems",
      "subtitle": "Design new Custom items and blocks!",
      "url": "https://polymart.org/resource/1"
    },
    "user": {
      "id": 132058
    }
  }
}

If your webhook secret is 55tcz_Hm0J7CoPNP, then the signature of this request will be a188b636d9d13acae1c1ff4c17513cf9f72d9b5f926f9dbd0617cb2f2439b248