Comment check

This is the call you will make the most. It takes a number of arguments and characteristics about the submitted content and then returns a thumbs up or thumbs down. Performance can drop dramatically if you choose to exclude data points. The more data you send Akismet about each comment, the greater the accuracy. We recommend erring on the side of including too much data.

This method is called with the following URL:

Important: All parameters should be sent via the POST method.


api_key (required)
Your Akismet API key. You can find this on your account dashboard at

blog (required)
The front page or home URL of the instance making the request. For a blog or wiki this would be the front page. Note: Must be a full URI, including http://.

user_ip (required)
IP address of the comment submitter.

User agent string of the web browser submitting the comment – typically the HTTP_USER_AGENT cgi variable. Not to be confused with the user agent of your Akismet library.

referrer (note spelling)
The content of the HTTP_REFERER header should be sent here.

The full permanent URL of the entry the comment was submitted to.

A string that describes the type of content being sent.


  • comment: A blog comment.
  • forum‑post: A top‑level forum post.
  • reply: A reply to a top‑level forum post.
  • blog‑post: A blog post.
  • contact‑form: A contact form or feedback form submission.
  • signup: A new user account.
  • message: A message sent between just a few users.

You may send a value not listed above if none of them accurately describe your content. This is further explained here.

Name submitted with the comment.

Email address submitted with the comment.

URL submitted with comment. Only send a URL that was manually entered by the user, not an automatically generated URL like the user’s profile URL on your site.

The content that was submitted.

The UTC timestamp of the creation of the comment, in ISO 8601 format. May be omitted for comment‑check requests if the comment is sent to the API at the time it is created.

The UTC timestamp of the publication time for the post, page or thread on which the comment was posted.

Indicates the language(s) in use on the blog or site, in ISO 639‑1 format, comma‑separated. A site with articles in English and French might use “en, fr_ca”.

The character encoding for the form values included in comment_* parameters, such as “UTF-8” or “ISO-8859-1”.

The user role of the user who submitted the comment. This is an optional parameter. If you set it to “administrator”, Akismet will always return false.

This is an optional parameter. You can use it when submitting test queries to Akismet.

If you are sending content to Akismet to be rechecked, such as a post that has been edited or old pending comments that you’d like to recheck, include the parameter recheck_reason with a string describing why the content is being rechecked. For example, recheck_reason=edit.

If you use a honeypot field in your implementation, include the name of the field in your request as well as the value of that field. For example, if you have a honeypot field that looks like <input type=”text” name=”hidden_honeypot_field” style=”display: none;” />, then you should include two extra parameters in your request: honeypot_field_name=hidden_honeypot_field and hidden_honeypot_field=[the value of the input].

The comment_context parameter provides context for the environment in which the comment was posted: a list of tags or categories applied to the parent blog post or the site on which the comment was posted.

Specify comment_context using PHP-style array parameter notation: comment_context[]=cooking&comment_context[]=recipes&comment_context[]=bbq Note that any tags or categories should be taken from the parent post or environment; they should not be supplied by the commenters themselves.

Other server environmental variables
In PHP, there is an array of environmental variables called $_SERVER that contains information about the Web server itself as well as a key/value for every HTTP header sent with the request. This data is highly useful to Akismet. How the submitted content interacts with the server can be very telling, so please include as much of it as possible.

PHP example

$data = array(
    'blog' => '',
    'user_ip' => '',
    'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6',
    'referrer' => '',
    'permalink' => '',
    'comment_type' => 'comment',
    'comment_author' => 'admin',
    'comment_author_email' => '',
    'comment_author_url' => '',
    'comment_content' => 'It means a lot that you would take the time to review our software.  Thanks again.'

akismet_comment_check( '123YourAPIKey', $data );

// Passes back true (it's spam) or false (it's ham).
function akismet_comment_check( $api_key, $data ) {
    $request = 'api_key=' . urlencode( $api_key ) .
        '&blog=' . urlencode( $data['blog'] ) .
        '&user_ip=' . urlencode( $data['user_ip'] ) .
        '&user_agent=' . urlencode( $data['user_agent'] ) .
        '&referrer=' . urlencode( $data['referrer'] ) .
        '&permalink=' . urlencode( $data['permalink'] ) .
        '&comment_type=' . urlencode( $data['comment_type'] ) .
        '&comment_author=' . urlencode( $data['comment_author'] ) .
        '&comment_author_email=' . urlencode( $data['comment_author_email'] ) .
        '&comment_author_url=' . urlencode( $data['comment_author_url'] ) .
        '&comment_content=' . urlencode( $data['comment_content'] );
    $host = $http_host = '';
    $path = '/1.1/comment-check';
    $port = 443;
    $akismet_ua = "WordPress/4.4.1 | Akismet/3.1.7";
    $content_length = strlen( $request );
    $http_request  = "POST $path HTTP/1.0\r\n";
    $http_request .= "Host: $host\r\n";
    $http_request .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $http_request .= "Content-Length: {$content_length}\r\n";
    $http_request .= "User-Agent: {$akismet_ua}\r\n";
    $http_request .= "\r\n";
    $http_request .= $request;
    $response = '';
    if( false != ( $fs = @fsockopen( 'ssl://' . $http_host, $port, $errno, $errstr, 10 ) ) ) {

    	fwrite( $fs, $http_request );

    	while ( !feof( $fs ) ) {
    		$response .= fgets( $fs, 1160 ); // One TCP-IP packet

    	fclose( $fs );

    	$response = explode( "\r\n\r\n", $response, 2 );

    if ( 'true' == $response[1] ) {
        return true;
    } else {
    	return false;

This call returns either “true” (if this is spam) or “false” if it’s not.

Spam response example

The call returns “true” if the comment is spam. If you are having trouble triggering a spam response, you can send “akismet‑guaranteed‑spam” as the author or “” as the author email. Either value will always trigger a “true” response.

Array (
    [0] => HTTP/1.1 200 OK
           Server: nginx
           Date: Mon, 24 Feb 2014 20:17:08 GMT
           Content-Type: text/plain; charset=utf-8
           Connection: close
           Content-length: 4
    [1] => true

A spam response may also include the X-akismet-pro-tip header, like so:

Array (
    [0] => HTTP/1.1 200 OK
           Server: nginx
           Date: Mon, 24 Feb 2014 20:17:08 GMT
           Content-Type: text/plain; charset=utf-8
           Connection: close
           X-akismet-pro-tip: discard
           Content-length: 4
    [1] => true

If the X-akismet-pro-tip header is set to discard, then Akismet has determined that the comment is blatant spam, and you can safely discard it without saving it in any spam queue. Read more about this feature in this Akismet blog post.

Ham response example

The call returns “false” if the comment is ham. If you are having trouble triggering a ham response, you can set “user_role” to “administrator” and set the “is_test” parameter to “true”, and it will always trigger a “false” response.

Array (
    [0] => HTTP/1.1 200 OK
           Server: nginx
           Date: Mon, 24 Feb 2014 20:17:08 GMT
           Content-Type: text/plain; charset=utf-8
           Connection: close
           Content-length: 4
    [1] => false

Error response example

If the call returns neither true nor false, the X-akismet-debug-help header will provide context for any error that has occurred. Note that the X-akismet-debug-help header will not always be sent if a response does not return false or true.

Array (
    [0] => HTTP/1.1 200 OK
           Server: nginx
           Date: Mon, 24 Feb 2014 16:34:54 GMT
           Content-Type: text/plain; charset=utf-8
           Connection: close
           X-akismet-debug-help: We were unable to parse your blog URI
           Content-length: 7
    [1] => invalid

Testing your data

It is important to test Akismet with a significant amount of real, live data in order to draw any conclusions on accuracy. Akismet works by comparing content to genuine spam activity happening right now (and this is based on more than just the content itself), so artificially generating spam comments is not a viable approach.

We’re here to help

If you ever get stuck or need help troubleshooting something, please don’t hesitate to contact us.