Skip to content

Resource Update Checks

Publish the latest version of each resource you sell so installed copies can check for updates.

A product can publish the latest version of the resource it sells. Installed copies of the resource request a URL on your store and compare the answer with their own version. When you release an update, change the version in the editor and every server that checks sees it.

Requirements

RequirementDetail
PlanStarter, Pro, or Ultra
StorePublished. Unpublished, suspended, and demo stores answer every check with 404.
ProductA specific product. The default product settings cannot hold a resource version.

Set up a product

  1. Open your project in the editor and select the Product Detail page.
  2. Select the product in the toolbar.
  3. In the Properties panel, find Resource Updates under 5Metrics Usage.
  4. Enter the Resource Name. The placeholder shows the product's Tebex slug. Use the name your resource will request.
  5. Enter the Latest Version in the same format your resource uses, for example v1.2.0.
  6. Save your changes, then publish the store if it is not live yet.

The Update URL field shows the address to put in your resource. It uses your verified custom domain when your plan includes custom domains, and your .taintless.store subdomain otherwise.

Keep the URL stable

Installed copies keep calling the URL they shipped with. Keep the resource name unchanged while older copies are in use. The .taintless.store address keeps answering after you add a custom domain; a custom-domain address stops answering if the domain is removed.

Name and version rules

FieldRules
Resource NameUp to 64 lowercase letters, numbers, - and _. Starts with a letter or number, cannot be only numbers, and is unique per store.
Latest VersionUp to 32 letters, numbers, ., +, - and _, starting with a letter or number. Returned exactly as entered.

Names are not case-sensitive in the URL: /api/versions/My-Resource and /api/versions/my-resource return the same version.

How the URL responds

SituationStatusBody
The name belongs to a product with a version200The version, for example v1.2.0
Unknown name, no version set, or store not live404Not found
Too many requests from one IP address429Too many requests
Temporary server error500Internal server error

The 200 body is plain text: no quotes, no JSON, and no trailing newline. Treat any other status as "no update information" and skip the check quietly.

Responses are cached. A saved version, or unpublishing the store, can take up to about 6 minutes to reach every server. A 404 can be cached for up to a minute. Errors are never cached.

Check for updates from a FiveM resource

This server-side example runs when the resource starts. It reads the installed version from fxmanifest.lua (for example version 'v1.2.0') and prints a notice when the store publishes a different one.

local UPDATE_URL = 'https://yourstore.taintless.store/api/versions/my-resource'

local resourceName = GetCurrentResourceName()
local installedVersion = GetResourceMetadata(resourceName, 'version', 0) or 'unknown'

PerformHttpRequest(UPDATE_URL, function(status, body)
  if status ~= 200 or not body then
    return -- Store unreachable or no version published: skip the check.
  end

  if body ~= installedVersion then
    print(('[%s] Version %s is available. Installed: %s'):format(resourceName, body, installedVersion))
  end
end, 'GET')
  • Hardcode the URL instead of building it from the resource folder name. Server owners can rename the folder.
  • Use one version format in both places. If fxmanifest.lua says 1.2.0 and the store says v1.2.0, the check reports an update that does not exist.
  • Check once at start-up or on a timer of several minutes. Very frequent checks from one IP address can receive 429.

Troubleshooting

IssueSolution
Every name returns 404Confirm the store is published, is on Starter or above, and that you saved in the editor
One name returns 404Confirm the URL ends with the Resource Name and the product has a Latest Version
The previous version is still returnedWait up to 6 minutes. Responses are cached
Save fails with a resource name errorEach name can belong to one product. Clear it on the other product first
Another product, even a deleted one, holds the nameUse Move the name here next to the conflict in Resource Updates, then save. Deployed resources checking that URL get this product's version, or 404 until it has one