Maigret Check Types for Site Detection: The Three Methods for Username Verification

Maigret determines whether a username is claimed or available by evaluating HTTP responses using three distinct checkType values: status_code, message, and response_url.

Maigret is an open-source OSINT utility developed in the soxoj/maigret repository that checks username availability across hundreds of sites. The detection mechanism for each site is governed by the checkType field stored in the site database, which instructs the tool how to interpret the server's response. Understanding these check types is essential for reading scan results correctly and troubleshooting site definitions.

What Are Maigret Check Types?

The checkType field defines the validation strategy Maigret applies after making an HTTP request to a target site. This value is declared per-site in maigret/resources/data.json and processed by the checking logic in utils/site_check.py. Each type examines a different attribute of the HTTP response—status codes, response bodies, or final URLs—to classify the username as claimed or available.

The Three Check Types for Site Detection

Maigret implements three primary check types to accommodate the diverse detection mechanisms used by different web services.

status_code

The status_code check type evaluates the HTTP status code returned by the request. According to the implementation in utils/site_check.py, status codes in the 200-299 range indicate that a username is claimed, while 404 or similar "not found" codes indicate the username is available.

This method is used by sites like GitHub:

{
  "GitHub": {
    "url": "https://github.com/{username}",
    "checkType": "status_code"
  }
}

When Maigret queries https://github.com/blue, a 200 response confirms the username is claimed, whereas a 404 marks it as available.

message

The message check type analyzes the response body for specific text strings. Maigret validates the presence of required strings (presenseStrs) and the absence of forbidden strings (absenceStrs). If the response contains at least one presence string and none of the absence strings—and the HTTP status is successful (2xx/3xx)—the username is considered claimed; otherwise, it is available.

Facebook uses this approach:

{
  "Facebook": {
    "url": "https://www.facebook.com/{username}",
    "checkType": "message",
    "presenseStrs": ["first_name"],
    "absenceStrs": ["rsrcTags"]
  }
}

For a query to https://www.facebook.com/zuck, Maigret checks that "first_name" appears in the HTML while "rsrcTags" does not, confirming the profile exists.

response_url

The response_url check type examines the final URL after following any redirects. Maigret compares the destination URL with the originally requested URL. If the URLs differ, the request is interpreted as a redirect indicating an unclaimed username; if they remain identical, the username is considered claimed.

MicrosoftLearn demonstrates this method:

{
  "MicrosoftLearn": {
    "url": "https://learn.microsoft.com/en-us/users/{username}",
    "urlProbe": "https://learn.microsoft.com/api/profiles/{username}",
    "checkType": "response_url"
  }
}

Maigret first queries the urlProbe endpoint. If the final URL after redirects matches the original probe URL, the username exists; divergence indicates availability.

Default Behavior and Fallback Logic

When a site definition in data.json omits the checkType field, Maigret defaults to "status_code". This fallback logic is implemented at line 433 of utils/site_check.py, ensuring sites without explicit configuration still utilize standard HTTP status code detection. The utils/check_top_n.py script also relies on these definitions when batch-processing the most popular sites.

Summary

  • Maigret uses three checkType values for site detection: status_code, message, and response_url.
  • status_code checks interpret 200-299 as claimed and 404 as available.
  • message validates response bodies using presenseStrs and absenceStrs arrays.
  • response_url compares pre- and post-redirect URLs to determine username status.
  • Site configurations are stored in maigret/resources/data.json and evaluated by utils/site_check.py.
  • The default check type is status_code when not explicitly specified.

Frequently Asked Questions

What is the default check type in Maigret if not specified?

If a site entry does not include a checkType field, Maigret automatically defaults to status_code. This fallback is defined in utils/site_check.py at line 433, ensuring that all sites use HTTP status code validation unless configured otherwise.

How does the message check type prevent false positives?

The message check type requires a conjunctive validation: the response must contain at least one string from presenseStrs and must not contain any strings listed in absenceStrs. This dual requirement filters out error pages and generic redirects that might contain profile-like text but also contain error indicators.

Can I use multiple check types for a single site?

No, each site definition supports only one checkType value. However, the message type offers flexibility by allowing multiple presence and absence strings, effectively creating compound conditions that approximate multi-factor validation within a single check type.

Where are the check type configurations stored and maintained?

All checkType definitions reside in maigret/resources/data.json within the repository. The interpretation logic is implemented in utils/site_check.py, with batch verification capabilities provided by utils/check_top_n.py.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →