Easily integrate and manage Envato purchase-code license validation on your WordPress themes and plugins. Follow the three steps below to get started.
License For Envato acts as a license server: it validates Envato purchase codes through the official Envato API and stores per-domain activation records in your database.
Configure this plugin on the WordPress site that will act as your license server.
Your token needs the following minimum permissions:
| Required Permission |
|---|
| View and search Envato sites |
| View your Envato Account username |
| View your email address |
| Verify purchases of your items |
| List purchases you've made |
Use the following URL (your WordPress site URL) in your client integration (Step 2):
https://YOUR_SITE_URL
Copy the class below into your theme or plugin. It handles license activation and deactivation by calling your server's REST API.
functions.php or a dedicated file in your plugin.YOUR_SITE_URL with your server URL (shown in Step 1).TEXT_DOMAIN with your theme/plugin's text domain.YOUR_PREFIX with a unique prefix for your product (e.g. mytheme).PREFIX to avoid collisions in the WordPress options table.<?php
/**
* licenseCodeVerifyForm()
*/
class licenseCodeVerifyForm {
const LICENCE_CALL_URL = "YOUR_SITE_URL";
const PREFIX = "YOUR_PREFIX";
private $licenceActivate_error;
private $licenceDeactivate_error;
public function __construct() {
$this->licenceActivate_error = $this->licenceActivate();
$this->licenceDeactivate_error = $this->licenceDeactivate();
$this->LicenceHTMLForm();
}
public function LicenceHTMLForm(){ ?>
<h2><?php esc_html_e('License Activation Form', 'TEXT_DOMAIN');?></h2>
<?php
$token = get_option(self::PREFIX.'_envato_token');
$isActivated = get_option(self::PREFIX.'_envato_is_activated');
if ($token && $isActivated) {
?>
<?php
if ($this->licenceDeactivate_error) {?>
<p class="licence_error"><?php echo esc_html( $this->licenceDeactivate_error );?></p>
<?php }?>
<p><?php esc_html_e('You can click this button to deactivate your license code from this domain if you are going to transfer your website to some other domain or server.', 'TEXT_DOMAIN');?></p>
<form method="post">
<input type="hidden" name="envato_deactivate" value="1">
<?php wp_nonce_field( 'submit_deactivate' ); ?>
<?php submit_button( esc_html__( 'Deactivate', 'TEXT_DOMAIN' ), 'danger', 'submit_deactivate' ); ?>
</form>
<?php
} else { ?>
<?php
if ($this->licenceActivate_error) {?>
<p class="licence_error"><?php echo esc_html( $this->licenceActivate_error );?></p>
<?php }?>
<form method="post">
<label for="purchase_code"><?php esc_html_e('Purchase code', 'TEXT_DOMAIN'); ?>
(<a href="https://help.market.envato.com/hc/en-us/articles/202822600-Where-Is-My-Purchase-Code-"
target="_blank"><?php esc_html_e('Where can I get my purchase code?', 'TEXT_DOMAIN');?></a>)
</label>
<input type="text" style="width:100%" id="purchase_code" name="purchase_code"
placeholder="Example: 1e71cs5f-13d9-41e8-a140-2cff01d96afb">
<?php wp_nonce_field( 'submit_activate' ); ?>
<?php submit_button( esc_html__( 'Activate', 'TEXT_DOMAIN' ), 'danger', 'submit_activate' ); ?>
</form>
<?php
}
}
private function licenceActivate() {
if ( ! isset( $_POST['submit_activate'] ) ) {
return;
}
if ( ! isset( $_POST['purchase_code'] ) || empty( $_POST['purchase_code'] ) ) {
return 'Please Enter Purchase Code.';
}
// Unslash and sanitize nonce
$nonce = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ) : '';
if ( ! wp_verify_nonce( $nonce, 'submit_activate' ) ) {
wp_die( 'Are you cheating?' );
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Are you cheating?' );
}
// Unslash and sanitize purchase_code
$purchase_code = isset( $_POST['purchase_code'] )
? sanitize_text_field( wp_unslash( $_POST['purchase_code'] ) )
: '';
if ( $purchase_code ) {
$url = self::LICENCE_CALL_URL . "/wp-json/licenseenvato/v1/active";
$domain = $this->domain();
$itemid = get_option( self::PREFIX . '_envato_itemid' );
$response = $this->apicall( $url, $purchase_code, $domain, $itemid );
$data = json_decode( $response );
$token = isset( $data->token ) ? $data->token : '';
$itemid = isset( $data->itemid ) ? $data->itemid : '';
if ( $token ) {
update_option( self::PREFIX . '_envato_is_activated_' . $itemid, true );
update_option( self::PREFIX . '_envato_token', $token );
update_option( self::PREFIX . '_envato_purchase_code', $purchase_code );
update_option( self::PREFIX . '_envato_itemid', $itemid );
} else {
$statusCode = isset( $data->code ) ? $data->code : '';
$statusMessage = isset( $data->message ) ? $data->message : '';
if ( $statusCode ) {
return $statusMessage;
}
}
}
}
private function domain() {
$domain = get_option( 'siteurl' );
$domain = str_replace( 'http://', '', $domain );
$domain = str_replace( 'https://', '', $domain );
$domain = str_replace( 'www', '', $domain );
return urlencode( $domain );
}
private function licenceDeactivate() {
$code = get_option( self::PREFIX . '_envato_token' );
if ( ! isset( $_POST['submit_deactivate'] ) ) {
return;
}
// Unslash and sanitize nonce
$nonce = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ) : '';
if ( ! wp_verify_nonce( $nonce, 'submit_deactivate' ) ) {
wp_die( 'Are you cheating?' );
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Are you cheating?' );
}
// Unslash and sanitize envato_deactivate
$envato_deactivate = isset( $_POST['envato_deactivate'] )
? sanitize_text_field( wp_unslash( $_POST['envato_deactivate'] ) )
: '';
if ( $envato_deactivate ) {
$url = self::LICENCE_CALL_URL . "/wp-json/licenseenvato/v1/deactive";
$response = $this->apicall( $url, $code );
$date = json_decode( $response );
$statusCode = isset( $date->code ) ? $date->code : '';
$statusMessage = isset( $date->message ) ? $date->message : '';
if ( $statusCode === 'already_deactivated' ) {
delete_option( self::PREFIX . '_envato_is_activated' );
delete_option( self::PREFIX . '_envato_token' );
delete_option( self::PREFIX . '_envato_purchase_code' );
delete_option( self::PREFIX . '_envato_itemid' );
} elseif ( $statusCode ) {
return $statusMessage;
} else {
delete_option( self::PREFIX . '_envato_is_activated' );
delete_option( self::PREFIX . '_envato_token' );
delete_option( self::PREFIX . '_envato_purchase_code' );
delete_option( self::PREFIX . '_envato_itemid' );
}
}
}
private function apicall( $url, $purchase_code, $domain = null, $itemid = null ) {
if ( $domain ) {
$body = array(
'code' => $purchase_code,
'domain' => $domain,
'itemid' => $itemid,
);
} else {
$body = array(
'token' => $purchase_code,
);
}
$headers = array( 'Content-Type' => 'application/json' );
$response = wp_remote_post( $url, array(
'method' => 'POST',
'headers' => $headers,
'body' => json_encode( $body ),
) );
return $response['body'];
}
}
?>
Once the class is in place, call it wherever you want to render the activation / deactivation form — for example, on your plugin's settings page.
<?php new licenseCodeVerifyForm(); ?>
The plugin exposes two public REST endpoints under the namespace licenseenvato/v1.
| Endpoint | https://YOUR_SITE_URL/wp-json/licenseenvato/v1/active |
| Method | POST |
| Auth | Public (no authentication required) |
| Parameter | Type | Required | Description |
|---|---|---|---|
code |
string | ✔ | Envato purchase code |
domain |
string | ✔ | Customer's domain (URL-encoded) |
itemid |
string | ✔ | Envato item / product ID |
| Endpoint | https://YOUR_SITE_URL/wp-json/licenseenvato/v1/deactive |
| Method | POST |
| Auth | Public (no authentication required) |
| Parameter | Type | Required | Description |
|---|---|---|---|
token |
string | ✔ | License token returned during activation |
$response = wp_remote_post( 'https://YOUR_SITE_URL/wp-json/licenseenvato/v1/active', [
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => json_encode( [
'code' => $purchase_code,
'domain' => urlencode( $domain ),
'itemid' => $item_id,
] ),
] );
$data = json_decode( wp_remote_retrieve_body( $response ) );
// $data->token — store this token; you will need it for deactivation
A quick reference for the key constants and methods inside the integration class.
| Constant | Description |
|---|---|
LICENCE_CALL_URL |
Base URL of your license server (your WordPress site URL). |
PREFIX |
Unique prefix used for wp_options keys. Change this per product to avoid collisions. |
| Method | Visibility | Description |
|---|---|---|
LicenceHTMLForm() |
public | Renders the activate / deactivate form HTML. |
licenceActivate() |
private | Handles the activation POST, calls REST API, stores token. |
licenceDeactivate() |
private | Handles deactivation POST, calls REST API, clears options. |
apicall() |
private | Sends POST request to the server REST endpoint. |
domain() |
private | Returns the current site's domain (URL-encoded). |
| Option Key | Description |
|---|---|
{PREFIX}_envato_token |
Stored license token returned by the server on activation. |
{PREFIX}_envato_is_activated |
Boolean — whether the license is currently active. |
{PREFIX}_envato_purchase_code |
The raw Envato purchase code entered by the customer. |
{PREFIX}_envato_itemid |
Envato item ID associated with the activated license. |
{PREFIX} with the value you set for the PREFIX constant — for example, if your prefix is mytheme, the token key would be mytheme_envato_token.