# Web Key Directory Checker
This tool verifies Web Key Directory (WKD) configuration for email addresses, checking both direct and advanced discovery methods. It validates policy files, CORS headers, key availability, and proper key association with the email address.

At least one Method is required to be set up for the WKD to work.

More Information on [how to set up WKD]({{< ref "/posts/WKD-setup/index.md" >}})

<div class="wkd-check-container has-content">
    <form method="post" action="/api/wkd" class="wkd-check-form" id="wkd-check" toolname="check_wkd" tooldescription="Check the status of Web Key Directory (WKD) configuration for an email address.">
        <div class="form-group">
            <input type="email" name="email" id="email" required autocapitalize="none" autocomplete="email"
                   placeholder="Enter email address to check WKD status"
                   class="email-input placeholder"
                   title="Email Address"
                   toolparamdescription="Email address to check" />
        </div>
        <button type="submit" class="check-button">Check WKD Status</button>
    </form>
    <div class="wkd-results" id="wkd-check-result">
<div class="result-section">
<h3>Direct Method <span class="badge badge-unknown">Unknown</span></h3>
<div class="status-grid">
<div class="status-item">
<div class="status-header">
<span class="status-label">Key Location:</span>
<span class="status-value key-location">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Key Available:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Key CORS Valid:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Key Type:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Fingerprint:</span>
<span class="status-value fingerprint">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Email in Key:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy Available:</span>
<span class="status-value">Unknown</span>
</div>
</div>
</div>
<details class="policy-dropdown">
<summary>
Policy Configuration <span class="badge badge-unknown">Unknown</span>
</summary>
<div class="policy-explanation">
The WKD specification requires a policy file to be present (even if empty) to check for WKD support and advanced configuration properties.
</div>
<div class="status-grid">
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy Location:</span>
<span class="status-value key-location">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy CORS Valid:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy Compliant:</span>
<span class="status-value">Unknown</span>
</div>
</div>
</div>
</details>
</div>
<div class="result-section unknown"> 
<h3>Advanced Method <span class="badge badge-unknown">Unknown</span></h3>
<div class="status-grid">
<div class="status-item">
<div class="status-header">
<span class="status-label">Key Location:</span>
<span class="status-value key-location">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Key Available:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Key CORS Valid:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Key Type:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Fingerprint:</span>
<span class="status-value fingerprint">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Email in Key:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy Available:</span>
<span class="status-value">Unknown</span>
</div>
</div>
</div>
<details class="policy-dropdown">
<summary>
Policy Configuration <span class="badge badge-unknown">Unknown</span>
</summary>
<div class="policy-explanation">
The WKD specification requires a policy file to be present (even if empty) to check for WKD support and advanced configuration properties.
</div>
<div class="status-grid">
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy Location:</span>
<span class="status-value key-location">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy CORS Valid:</span>
<span class="status-value">Unknown</span>
</div>
</div>
<div class="status-item">
<div class="status-header">
<span class="status-label">Policy Compliant:</span>
<span class="status-value">Unknown</span>
</div>
</div>
</div>
</details>
</div>
<div class="result-section unknown">
<h3>Overall Status <span class="badge badge-unknown">Unknown</span></h3>
<div class="status-grid">
<div class="status-item">
<span class="status-label">Valid:</span>
<span class="status-value">Unknown</span>
</div>
</div>
</div>
</div>
</div>

## NPM Library

This tool is powered by the [wkd-checker](https://www.npmjs.com/package/wkd-checker) npm library. You can use it in your own projects or run it via CLI. The JSON output below is identical to the library output.

### CLI Usage

```bash
npx wkd-checker test@example.com
```

### Library Usage

```javascript
const wkd = require('wkd-checker');

const email = 'test@example.com';

wkd.checkKey(email)
    .then(result => {
        console.log('WKD Result:', result);
        console.log('Advanced:', result.advanced.valid);
        console.log('Direct:', result.direct.valid);
    })

wkd.getKey(email)
    .then(key => {
        console.log('Retrieved Key:\n', key);
    })
    .catch(err => {
        console.error('Error retrieving key:', err);
    });
```

<details>
<summary><h2>API Documentation</h2></summary>

 **Endpoint**: `POST https://miarecki.eu/api/wkd`

 **Method**: `POST` with `Content-Type`: `application/json` or `application/x-www-form-urlencoded`

 **Request Body**:

 - JSON Format:
   ```json
   {
     "email": "user@example.com"
   }
   ```

 - x-www-form-urlencoded Format:
   ```
   email=user@example.com
   ```

 **Response**:

 - JSON Object with `advanced` and `direct` properties, each containing a `KeyCheckResult` object.

 - Example:
   ```json
    {
    "advanced": {
      "policy_location": "https://openpgpkey.miarecki.eu/.well-known/openpgpkey/miarecki.eu/policy",
      "policyAvailable": false,
      "policyCorsValid": false,
      "policy": null,
      "key_location": "https://openpgpkey.miarecki.eu/.well-known/openpgpkey/miarecki.eu/hu/u5u31zhdn1tyua7kdr4xmbd7k3h733b7?l=jonatan",
      "key_available": false,
      "keyCorsValid": false,
      "keyType": "Invalid",
      "keyTypeValid": false,
      "fingerprint": null,
      "emailInKey": false,
      "expired": false,
      "revoked": false,
      "policyCompliant": true,
      "valid": false
    },
    "direct": {
      "policy_location": "https://miarecki.eu/.well-known/openpgpkey/policy",
      "policyAvailable": true,
      "policyCorsValid": true,
      "policy": {
        "mailboxOnly": false,
        "daneOnly": false,
        "authSubmit": false,
        "protocolVersion": null,
        "submissionAddress": null,
        "others": []
      },
      "key_location": "https://miarecki.eu/.well-known/openpgpkey/hu/u5u31zhdn1tyua7kdr4xmbd7k3h733b7?l=jonatan",
      "key_available": true,
      "keyCorsValid": true,
      "keyType": "BinaryKey",
      "keyTypeValid": true,
      "fingerprint": "18EECCF319422F31D717796880B1C14A34B7634A",
      "emailInKey": true,
      "expired": false,
      "revoked": false,
      "policyCompliant": true,
      "valid": true
    }
    }
   ```