BLACK FRIDAY
Save 59% on PageForge Annual $191/year $485/year
Claim 59% Off →
Envato Toolkit icon
Possibly abandoned Tested up to 5.7.19 #14 in api

Envato Toolkit

Validate purchase code, check for item update & support expiration, download newest version, lookup for user details, search for Envato item id & more

Active installs5K+5K+ tier
Downloads · 30d360▲ +8.1% vs prev. 30d
Rating2.8/59 reviews
Health score32/100At risk
All-time downloads127.9KSince Jun 2017
Support resolved—No recent threads
RequiresWP 4.6PHP 5.4+
Downloads · 7d95▲ +9.2% week over week
Our verdict

Consider an alternative

Envato Toolkit shows warning signs in 2026 — compare the alternatives below before installing. It runs on 5K+ sites, is rated 2.8/5 and was last updated 5 years ago, and scores 32/100 on our health check.

  • Low rating so far — 2.8/5 from only 9 reviews
  • No update in 5 years
  • Only tested up to WordPress 5.7 (latest is 7.1)

How does it stack up?

Side-by-side on installs, updates, ratings & support

Daily downloads

51015Jun 29Aug 12Sep 26
Yesterday11
Daily average (1y)8
Peak day21Sep 10, 2026
Last 12 months3K

Download spikes usually follow a new release — each site that auto-updates counts as a download.

Rankings

Where Envato Toolkit stands today

WordPress.org search rankings

Live position in the plugin search, top 100
KeywordPositionCompeting pluginsCategory
api >100 10,000 Best api plugins →
envato #43 87 Best envato plugins →
license >100 8,805 Best license plugins →
purchase validator #55 72 Best purchase validator plugins →
update checker >100 782 Best update checker plugins →

Version adoption

Share of active sites per release.

  • 1.499.6%
  • 1.30.39%

Rating breakdown

★★★★★★★★★★ 2.8 from 9 reviews

  • 5★33.3%
  • 4★11.1%
  • 3★0.00%
  • 2★11.1%
  • 1★44.4%

About Envato Toolkit

From the official readme · v1.4

Description

It is a 3 files library + Visual UI, to validate the purchase codes of your customers, get details about specific Envato user (country, city, total followers, total sales, avatar), get his license purchase and support expiration dates, license type he bought, check for updates of purchased plugins and themes and get the download links for them.

Plus – this library has Envato Item Id search feature by providing plugin’s or theme’s name and author. So – yes, this is a tool you, as a developer / author, have been looking for months.

If you are looking for the library-only version to integrate into your plugin / theme, it’s on GitHub:
Envato Toolkit (Standalone)

The main purpose of this plugin is to help you to start much easier without having a headache trying to understand WordPress - Envato Market plugins code, that is the only one built by Envato, and has so complicated and unclear code, that you never get how it works (see example below).

When I tried to create plugin’s [Check for Update] and [Validate Purchase Code] feature-buttons in the plugin myself, and I saw the code of the WordPress - Envato Market plugin, I was shocked how badly it is written and how you should not to code.

For example – you would like to give an error message, if Envato user token is empty, which is a required string, i.e. – pAA0aBCdeFGhiJKlmNOpqRStuVWxyZ44. If you like K.I.S.S., PSR-2, D.R.Y., clean code coding standards and paradigms, you’d probably just have these five lines of code, so that every developer would get it:

$token = get_user_meta(get_current_user_id(), 'envato_token', TRUE);
if($token == "")
{
    return new \WP_Error('api_token_error', __('An API token is required.', 'envato-toolkit'));
}

Now lets see how the same task traceback looks like in WordPress - Envato Market plugin:

  1. [Api.php -> request(..)] Check if the token is empty:

    if ( empty( $token ) )
    {
        return new WP_Error( 'api_token_error', __( 'An API token is required.', 'envato-market' ) );
    }
    
  2. [Api.php -> request(..)] Parse it from another string:

    $token = trim( str_replace( 'Bearer', '', $args['headers']['Authorization'] ) );
    
  3. [Api.php -> request(..)] Parse it one more time – this time from arguments array:

    public function request( $url, $args = array() ) {
        $defaults = array(
            'timeout' => 20,
        );
        $args = wp_parse_args( $args, $defaults );
    }
    
  4. [Api.php -> download(..)] Transfer the token variable one more time – this time via params:

    class Envato_Market_API {
        public function download( $id, $args = array() ) {
            $url = 'https://api.envato.com/v2/market/buyer/download?item_id=' . $id . '&shorten_url=true';
            return $this->request( $url, $args );
        }
    }
    
  5. [admin.php -> maybe_deferred_download(..)] Pass it again – this time get it to args array from another method call:

    function maybe_deferred_download( $options ) {
        $args = $this->set_bearer_args();
        $options['package'] = envato_market()->api()->download( $vars['item_id'], $args );
        return $options;
    }
    
  6. [admin.php -> set_bearer_args(..)] Wrap the token into multi-dimensional string array:

    $args = array(
        'headers' => array(
            'Authorization' => 'Bearer ' . $token,
        ),
    );
    
  7. [admin.php -> set_bearer_args(..)] Pass the wrapped token one more time – this time get it from get_option:

    foreach ( envato_market()->get_option( 'items', array() ) as $item ) {
        if ( $item['id'] === $id ) {
            $token = $item['token'];
            break;
        }
    }
    
  8. [admin.php -> get_option(..)] So what’s in this get_option? – Correct, another call to another method – get_options():

    public function get_option( $name, $default = '' ) {
        $options = self::get_options();
        $name = self::sanitize_key( $name );
        return isset( $options[ $name ] ) ? $options[ $name ] : $default;
    }
    
  9. [admin.php -> get_options()] Finally, after almost 10 steps in the tree, we are finally getting the original
    WordPress method call, but now I’m getting confused again – what is that option_name variable here:

    public function get_options() {
        return get_option( $this->option_name, array() );
    }
    
  10. [envato-market.php -> init_globals()] Here is it is – the option name key name is… Oh wait…
    No it is not here it. It is equals to another variable, who is is put
    in another clean-up function – look like I’m keep seeing this for the 2 time in the tree – the sanitization of sanitization:

    $this->option_name = self::sanitize_key( $this->slug );
    
  11. [envato-market.php -> init_globals()] So the option name key name is the name of $this->slug.
    Now lets see what is the value of $this->slug:

    $this->slug        = 'envato-market';
    

So it takes eleven (!) steps to understand one variable. And the whole code of that plugin is like that. The example above was the headache I had, until I realized that I must write a new Envato API Management Toolkit, instead of trying to use what Envato is giving, because otherwise I won’t get anything working ever.

And, I believe, that many other developers had the same issue when tried to create update check feature for their plugins or themes.

So instead of using that library for myself, I decided that I want to help all these developers to save their time, and I’m sharing this code with you. I’m releasing it under MIT license, which allows you to use this code in your plugin without any restrictions for both – free and commercial use.

Plus – I’m giving a promise to you, that this plugin is and will always be 100% free, without any ads, ‘Subscribe’, ‘Follow us’, ‘Check our page’, ‘Get Pro Version’ or similar links.

If you created in hi-quality code a valuable additional functionality to the library and you want to share it with everyone – I’m open here to support your efforts, and add your code to the plugin’s library, so that we all together make this plugin better for authors – the better is the plugin, the better plugins authors will make for their customers. The better quality products we will have on the internet, the happier people will be all over the world.

Finally – the code is poetry – the better is the plugin, the happier is the world.

The pseudo-code of example output of the plugin is this:

Details about you:
----------------------------------------------------------
List of all different plugins you bought:
<?php foreach($plugins AS $pluginId => $plugin): ?>
    <?='Plugin Id: '.$pluginId.', Name: '.$plugin['name'];?>, Licenses:
    <?php foreach($plugin['licenses'] AS $license): ?>
        Code: <?=$license['purchase_code'];?>,
        License: <?=$license['license'];?>,
        Purchased: <?=$license['license_purchase_date'];?> <?=$license['license_purchase_time'];?>,
        Expires: <?=$license['support_expiration_date'];?> <?=$license['support_expiration_time'];?>,
        Support Status: <?=$license['support_active'];?>
    <?php endforeach; ?>
<?php endforeach; ?>

List of all different themes you bought:
<?php foreach($themes AS $themeId => $theme): ?>
    <?='Theme Id: '.$themeId.', Name: '.$theme['name'];?>, Licenses:
    <?php foreach($theme['licenses'] AS $license): ?>
        Code: <?=$license['purchase_code'];?>,
        License: <?=$license['license'];?>,
        Purchased: <?=$license['license_purchase_date'];?> <?=$license['license_purchase_time'];?>,
        Expires: <?=$license['support_expiration_date'];?> <?=$license['support_expiration_time'];?>,
        Status: <?=$license['support_active'] == 1 ? "Supported" : "Support Expired";?>
    <?php endforeach; ?>
<?php endforeach; ?>

Your summary:
Your location is <?=$authorCity;?>, <?=$authorCountry;?>.
You've sold your items <?=$authorSales;?> times and you have <?=$authorFollowers;?> followers on Envato.

1. Your Customer's License Details
----------------------------------------------------------
Purchase Code: <?=$targetPurchaseCode;?>
Is Valid License: <?=$isValidTargetLicense ? 'Yes' : 'No';?>
Buyer Username: <?=$targetLicenseBuyer;?>
License Type: <?=$targetLicenseType;?>
Purchased At: <?=$targetLicensePurchasedAt;?>
Supported Until: <?=$targetLicenseSupportedUntil;?>
Support Status: <?=$targetLicenseSupportActive == 1 ? "Supported" : "Support Expired";?>

2. Details About Target Envato User - <?=$targetUsername;?>
----------------------------------------------------------
<?=$targetUsername;?> is located in <?=$targetUserCity;?>, <?=$targetUserCountry;?>.
He sold his items <?=$targetUserSales;?> times and has <?=$targetUserFollowers;?> followers on Envato.

3. Status of Purchased Plugin ID - <?=$targetPluginId;?>
----------------------------------------------------------
Plugin Name: <?=$nameOfTargetPluginId;?>
Plugin Update Available: <?=$pluginUpdateAvailable ? 'Yes' : 'No';?>
Installed Plugin Version: <?=$installedPluginVersion;?>
Available Plugin Version: <?=$availablePluginVersion;?>
Plugin Update Download URL:
<a href="<?=$pluginUpdateDownloadUrl;?>" target="_blank" title="Download newest version">Download newest version</a>

4. Status of Purchased Theme ID - <?=$targetThemeId;?>:
----------------------------------------------------------
Theme Name: <?=$nameOfTargetThemeId;?>
Theme Update Available: <?=$themeUpdateAvailable ? 'Yes' : 'No';?>
Installed Theme Version: <?=$installedThemeVersion;?>
Available Theme Version: <?=$availableThemeVersion;?>
Theme Update Download URL:
<a href="<?=$themeUpdateDownloadUrl;?>" target="_blank" title="Download newest version">Download newest version</a>

5. Envato Item Id of Purchased Plugin
----------------------------------------------------------
Searched for Name: <?=$targetPluginName;?>
Searched for Author: <?=$targetPluginAuthor;?>
Found Plugin Id: <?=$foundPluginId;?>

6. Envato Item Id of Purchased Theme
----------------------------------------------------------
Searched for Name: <?=$targetThemeName;?>
Searched for Author: <?=$targetThemeAuthor;?>
Found Theme Id: <?=$foundThemeId;?>

And the example input of the output above, it this:

$objToolkit = new EnvatoAPIManager($toolkitSettings);

// Details about you
$purchasedPlugins = $objToolkit->getPurchasedPluginsWithDetails();
$plugins = array();
foreach($purchasedPlugins AS $pluginId => $purchasedPlugin)
{
    $purchasedPlugin['licenses'] = $objToolkit->getLicensesByItemId($pluginId);
    $plugins[$pluginId] = $purchasedPlugin;
}

$purchasedThemes = $objToolkit->getPurchasedThemesWithDetails();
$themes = array();
foreach($purchasedThemes AS $themeId => $purchasedTheme)
{
    $purchasedTheme['licenses'] = $objToolkit->getLicensesByItemId($themeId);
    $themes[$themeId] = $purchasedTheme;
}

$authorDetails = $objToolkit->getUserDetails($sanitizedEnvatoUsername);
// View vars
$view->plugins = $plugins;
$view->themes = $themes;
if($authorDetails != FALSE)
{
    $view->authorCity = $authorDetails['city'];
    $view->authorCountry = $authorDetails['country'];
    $view->authorSales = $authorDetails['sales'];
    $view->authorFollowers = $authorDetails['followers'];
} else
{
    $view->authorCity = '';
    $view->authorCountry = '';
    $view->authorSales = 0;
    $view->authorFollowers = 0;
}

// 1. Details About Target Purchase Code
$targetLicenseDetails = $objToolkit->getLicenseDetails($sanitizedTargetPurchaseCode);
// View vars
$view->targetPurchaseCode = esc_html($sanitizedTargetPurchaseCode); // Ready for print
$view->isValidTargetLicense = $objToolkit->isValidLicense($sanitizedTargetPurchaseCode);
$view->targetLicenseBuyer = $targetLicenseDetails['buyer_username'];
$view->targetLicense = $targetLicenseDetails['license'];
$view->targetLicensePurchasedAt = $targetLicenseDetails['license_purchase_date'].' '.$targetLicenseDetails['license_purchase_time'];
$view->targetLicenseSupportedUntil = $targetLicenseDetails['support_expiration_date'].' '.$targetLicenseDetails['support_expiration_time'];
$view->targetLicenseSupportActive = $targetLicenseDetails['support_active'];

// 2. Details About Target Envato User
$targetUserDetails = $objToolkit->getUserDetails($sanitizedTargetUsername);
// View vars
$view->targetUsername = esc_html($sanitizedTargetUsername); // Ready for print
$view->targetUserCity = $targetUserDetails['city'];
$view->targetUserCountry = $targetUserDetails['country'];
$view->targetUserSales = $targetUserDetails['sales'];
$view->targetUserFollowers = $targetUserDetails['followers'];

// 3. Status of Purchased Plugin ID
$availablePluginVersion = $objToolkit->getAvailableVersion($sanitizedTargetPluginId);
$pluginUpdateAvailable = version_compare($sanitizedInstalledPluginVersion, $availablePluginVersion, '<');
// View vars
$view->targetPluginId = intval($sanitizedTargetPluginId); // Ready for print
$view->installedPluginVersion = esc_html($sanitizedInstalledPluginVersion); // Ready for print
$view->nameOfTargetPluginId = esc_html($objToolkit->getItemName($sanitizedTargetPluginId));
$view->availablePluginVersion = $availablePluginVersion;
$view->pluginUpdateAvailable = $pluginUpdateAvailable;
$view->pluginUpdateDownloadUrl = $pluginUpdateAvailable ? $objToolkit->getDownloadUrlIfPurchased($sanitizedTargetPluginId) : '';

// 4. Status of Purchased Theme ID
$availableThemeVersion = $objToolkit->getAvailableVersion($sanitizedTargetThemeId);
$themeUpdateAvailable = version_compare($sanitizedInstalledThemeVersion, $availableThemeVersion, '<');
// View vars
$view->targetThemeId = intval($sanitizedTargetThemeId); // Ready for print
$view->installedThemeVersion = esc_html($sanitizedInstalledThemeVersion); // Ready for print
$view->nameOfTargetThemeId = esc_html($objToolkit->getItemName($sanitizedTargetThemeId));
$view->availableThemeVersion = $availableThemeVersion;
$view->themeUpdateAvailable = $themeUpdateAvailable;
$view->themeUpdateDownloadUrl = $themeUpdateAvailable ? $objToolkit->getDownloadUrlIfPurchased($sanitizedTargetThemeId) : '';

// 5. Envato Item Id of Purchased Plugin
$view->targetPluginName = esc_html($sanitizedTargetPluginName); // Ready for print
$view->targetPluginAuthor = esc_html($sanitizedTargetPluginAuthor); // Ready for print
$view->foundPluginId = $objToolkit->getItemIdByPluginAndAuthorIfPurchased($sanitizedTargetPluginName, $sanitizedTargetPluginAuthor);

// 6. Envato Item Id of Purchased Theme
$view->targetThemeName = esc_html($sanitizedTargetThemeName); // Ready for print
$view->targetThemeAuthor = esc_html($sanitizedTargetThemeAuthor); // Ready for print
$view->foundThemeId = $objToolkit->getItemIdByThemeAndAuthorIfPurchased($sanitizedTargetThemeName, $sanitizedTargetThemeAuthor);

Installation

This section describes how to install the plugin and get it working.

  1. Upload EnvatoToolkit (or toolkit-for-envato) to the /wp-content/plugins/ directory.
  2. Activate the plugin through the ‘Plugins’ menu in WordPress.
  3. Go to admin menu item EnvatoToolkit and enter your Envato Username, Envato API Key and Envato Private Token.
  4. That’s it.

Frequently asked questions

How does it work?

This plugin uses both – Envato Edge API and Envato Market API to retrieve required data automatically, without any need of server-in-the-middle. So there is no need to save your head revision number or last version on your server, it will get that that automatically from Envato via it’s API.

Changelog

Just drag and drop new plugin folder.

1.4

  • Improved debugging.

1.3

  • Added support for purchase time and license expiration time. Plus split to two fields on ‘license_type’ to ‘license’ and ‘license_type’.

1.2

  • Added support for the situations if Envato API is down, plus added detailed error message handler.

1.1

  • Removed 1 redundant API class method that should be handled by the controller, not a model. Plus, for security reasons, changelog.txt is no more in the plugin folder (so that there would be no way to discover the actual plugin version by public.

1.0

  • Initial release!

Full changelog on WordPress.org →

Screenshots

Envato Toolkit - Search input
Envato Toolkit - Search input
Envato Toolkit - Search results
Envato Toolkit - Search results

For developers

Is this your plugin? Show off the numbers.

Add a live badge to your site, docs or GitHub README. It updates on its own — no account needed.

Active installs badge Rating badge Health score badge

Best Envato Toolkit alternatives

All api plugins →
Alternatives
Rank Plugin Active installs Rating Updated Health
1 WP Consent API WP Consent API Simple Consent API to read and register the current consent category. by Rogier Lankhorst 200K+ ★★★★★★★★★★ 5 (2) 2 weeks ago 86
2 Disable REST API Disable REST API Disable the use of the REST API on your website to site users. Now with User Role support! by Dave McHale 80K+ ★★★★★★★★★★ 4.8 (38) 3 years ago 48
3 Mailgun for WordPress Mailgun for WordPress Easily send email from your WordPress site through Mailgun using the HTTP API or SMTP. by Mailgun 80K+ ★★★★★★★★★★ 3.8 (49) 2 days ago 86
4 Make Connector Make Connector Make Connector. Make lets you design, build, and automate by connecting with WordPress in… by Make 70K+ ★★★★★★★★★★ 2.7 (25) 8 months ago 41
5 Disable WP REST API Disable WP REST API Disables the WP REST API for visitors not logged into WordPress. by Jeff Starr 30K+ ★★★★★★★★★★ 4.8 (36) 2 months ago 86
6 WP REST Cache WP REST Cache Enable caching of the WordPress REST API and auto-flush caches upon wp-admin editing. by Acato 10K+ ★★★★★★★★★★ 4.9 (42) 2 months ago 70
7 WPGet API – Connect to any external REST API WPGet API – Connect to any external REST API Connect any REST API to WordPress. WPGet API enables easy API integration, allowing you to… by David Anderson / Team Updraft 10K+ ★★★★★★★★★★ 5 (32) 2 months ago 90
8 WPGraphQL for ACF WPGraphQL for ACF WPGraphQL for ACF seamlessly integrates Advanced Custom Fields with WPGraphQL. by Jason Bahl 10K+ ★★★★★★★★★★ 5 (1) 3 weeks ago 75
9 WordPress REST API (Version 2) WordPress REST API (Version 2) Access your site's data through an easy-to-use HTTP REST API. (Version 2) by Ryan McCue 10K+ ★★★★★★★★★★ 4.2 (34) 9 years ago 43
10 WP REST API Controller WP REST API Controller Enable a UI to toggle visibility and customize properties in WP REST API requests. by Evan Herman 8K+ ★★★★★★★★★★ 4.3 (12) 4 years ago 38

FAQ

Envato Toolkit: quick answers

Straight answers, pulled from live WordPress.org data.

Live data from WordPress.org · checked Sep 27, 2026

Is Envato Toolkit free?

Yes. Envato Toolkit is free to download and use from the official WordPress.org plugin directory.

Is Envato Toolkit safe to use in 2026?

Envato Toolkit shows warning signs in 2026 — compare the alternatives below before installing. It runs on 5K+ sites, is rated 2.8/5 and was last updated 5 years ago, and scores 32/100 on our health check.

How many websites use Envato Toolkit?

Envato Toolkit is active on 5K+ WordPress websites and has been downloaded 127,915 times since it launched in June 2017. It was downloaded 360 times in the last 30 days.

Does Envato Toolkit work with WordPress 7.1?

Envato Toolkit is officially tested up to WordPress 5.7.19, while the latest release is 7.1.2. It may still work, but try it on a staging site first.

What PHP version does Envato Toolkit need?

Envato Toolkit requires PHP 5.4 or higher. Most hosts run PHP 8.x today, so it works on any modern WordPress hosting.

When was Envato Toolkit last updated?

The latest version, 1.4, was released on April 26, 2021 (5 years ago).

Who makes Envato Toolkit?

Envato Toolkit is developed and maintained by KestutisIT.

What are the best alternatives to Envato Toolkit?

The most popular alternatives to Envato Toolkit are WP Consent API (200K+ installs), Disable REST API (80K+ installs) and Mailgun for WordPress (80K+ installs).

Powered by PageForge

Want thousands of pages that rank like these? Build them in an afternoon.

This directory runs on the same engine as PageForge. Turn any spreadsheet, CSV or API into thousands of fast, SEO-ready WordPress pages — with schema, internal links and AI-written copy baked in.

  • CSV, Google Sheets & API data sources
  • AI content, schema & internal links per page
  • Works with Elementor, Gutenberg, Yoast & Rank Math
  • Free on WordPress.org — no credit card
Sarah is here to help!
Hi there! 👋 Need help finding what you're looking for?
Sarah
Sarah
Online & Ready to Help
Hi there! 👋 Need help finding what you're looking for?

We'll use this to continue our conversation

Just now ✓ Verified

Join 500+ SEO Pros Scaling Their Strategy

Get exclusive programmatic SEO tactics, AI content workflows, and the latest PageForge updates delivered straight to your inbox. Stay ahead of the algorithm.

We care about your data in our privacy policy.