# Feature Checker API
> Check if a company's website uses a specific feature, technology, or capability. Detects JavaScript libraries, security badges, technology stacks, and more.
**Base URL:** `https://api.nyne.ai`
**Endpoint:** `https://api.nyne.ai/company/checkfeature`

---

## Overview
The Feature Checker API lets you detect whether a company's website uses a specific technology, library, security certification, or capability. Submit a company name or domain along with the feature you want to detect, receive a request_id, then poll for completion or register a callback URL. Use cases include technology stack detection, compliance verification, competitive analysis, and sales qualification.
### What You Get
- **JavaScript Libraries:** Detect jQuery, React, Vue.js, Angular, Google Analytics, and more- **Security & Compliance:** SOC 2 badges, ISO 27001 certification, GDPR compliance, HIPAA statements- **Technology Stack:** Cloudflare, WordPress, AWS, Shopify, and other platforms- **Features & Integrations:** Live chat, SSO support, Salesforce integration, API access
## Authentication

All requests require header authentication:

```
X-API-Key: YOUR_API_KEY
X-API-Secret: YOUR_API_SECRET
```

## Rate Limits

| Limit | Value |
|-------|-------|
| Per Minute | 60 requests |
| Per Hour | 1000 requests |
| Monthly | Varies by plan |

### Response Headers

Responses from endpoints that perform rate-limit checks include both legacy and standard rate-limit headers:

| Header | Description |
|--------|-------------|
| `X-RateLimit-Limit` | Active per-minute or per-hour limit |
| `X-RateLimit-Remaining` | Remaining requests in the active window |
| `X-RateLimit-Reset` | Unix timestamp when the active window resets |
| `RateLimit-Limit` | Active per-minute or per-hour limit |
| `RateLimit-Remaining` | Remaining requests in the active window |
| `RateLimit-Reset` | Seconds until the active window resets |
| `Retry-After` | Seconds to wait before retrying; present on HTTP `429` rate-limit responses |

Monthly quota responses include quota-specific headers when available:

| Header | Description |
|--------|-------------|
| `X-Quota-Limit` | Monthly request or credit limit |
| `X-Quota-Used` | Amount used in the current billing cycle |
| `X-Quota-Remaining` | Amount remaining in the current billing cycle |
| `X-Quota-Reset` | Unix timestamp when the current billing cycle resets |

## Credit Usage

- **Feature Check:** 3 credits per completed check (found or not_found result)
> Credits are charged when a result (found/not_found) is produced. If the request fails or times out, no credits are charged.
---

## POST /company/checkfeatureQueue a feature check for the specified company.
### Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `company` | string | Yes | Company name or domain to check |
| `feature` | string | Yes | Feature to detect (e.g., &quot;jQuery library&quot;, &quot;SOC 2 badge&quot;, &quot;uses Cloudflare&quot;) |
| `callback_url` | string | No | HTTPS URL to receive the completed payload automatically |

> **Required:** Both company and feature are required.
### Request Examples

**Basic Request:**

```json
{
  "company": "stripe.com",
  "feature": "React",
  "callback_url": "https://example.com/webhooks/checkfeature"
}
```

### Code Examples

**cURL:**

```bash
curl -X POST https://api.nyne.ai/company/checkfeature \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "X-API-Secret: YOUR_API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "company": "stripe.com",
    "feature": "React"
  }'
```

**Python:**

```python
import requests
import json

url = "https://api.nyne.ai/company/checkfeature"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "X-API-Secret": "YOUR_API_SECRET",
    "Content-Type": "application/json"
}

data = {
    "company": "stripe.com",
    "feature": "React"
}

response = requests.post(url, headers=headers, json=data)
result = response.json()
print(json.dumps(result, indent=2))
```

**JavaScript:**

```javascript
const url = "https://api.nyne.ai/company/checkfeature";
const headers = {
    "X-API-Key": "YOUR_API_KEY",
    "X-API-Secret": "YOUR_API_SECRET",
    "Content-Type": "application/json"
};

const data = {
    company: "stripe.com",
    feature: "React"
};

fetch(url, {
    method: "POST",
    headers: headers,
    body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
```

**PHP:**

```php
<?php
$url = "https://api.nyne.ai/company/checkfeature";
$headers = [
    "X-API-Key: YOUR_API_KEY",
    "X-API-Secret: YOUR_API_SECRET",
    "Content-Type: application/json"
];

$data = [
    "company" => "stripe.com",
    "feature" => "React"
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
$result = json_decode($response, true);
curl_close($ch);

echo json_encode($result, JSON_PRETTY_PRINT);
?>
```

### Response Codes

| Code | Description |
|------|-------------|
| 200 | Request queued successfully |
| 400 | Invalid request parameters |
| 401 | Invalid API credentials |
| 402 | Insufficient credits |
| 429 | Rate limit exceeded |

### Response Example

```json
{
  "success": true,
  "data": {
    "request_id": "cocf_64f2d8e4_1700000123",
    "status": "queued",
    "message": "Company feature check queued. Use GET /company/checkfeature?request_id=... to check status.",
    "callback_url": "https://example.com/webhooks/checkfeature"
  },
  "timestamp": "2025-11-10T22:20:03Z"
}
```

---

## GET /company/checkfeature
Check the status of a request.

### Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `request_id` | string | Yes | Identifier returned by the POST call |

### Request Example

```
GET /company/checkfeature?request_id=cocf_64f2d8e4_1700000123
```

### Response Codes

| Code | Description |
|------|-------------|
| 200 | Status retrieved successfully |
| 400 | Invalid request parameters |
| 401 | Invalid API credentials |
| 404 | Request ID not found |

### Response Example

```json
{
  "success": true,
  "data": {
    "request_id": "cocf_64f2d8e4_1700000123",
    "status": "completed",
    "result": {
      "company": "Stripe",
      "feature": "jQuery library",
      "has_feature": true,
      "confidence": "high",
      "evidence": "Found jQuery version 3.6.0 loaded in multiple script tags on stripe.com"
    },
    "created_on": "2025-11-10T22:20:03Z",
    "completed_on": "2025-11-10T22:20:17Z"
  },
  "timestamp": "2025-11-10T22:20:17Z"
}
```

---

## Response Format

All API responses follow a consistent JSON format. All fields in enrichment results are **optional** and only included when data is available:
- The has_feature field is a boolean indicating whether the feature was detected- The confidence field indicates detection confidence: high, medium, or low- The evidence field provides a human-readable explanation of how the feature was detected- If a field has no data, it will be omitted from the response
---

## Error Codes

| HTTP Code | Error Code | Description |
|-----------|------------|-------------|
| 400 | `missing_parameters` | company or feature omitted |
| 400 | `invalid_callback_url` | Callback URL must be HTTPS |
| 403 | `subscription_required` | Account lacks enrichment product access |
| 402 | `insufficient_credits` | Not enough credits available |
| 429 | `rate_limit_exceeded` | Usage limits exceeded |
| 429 | `monthly_limit_exceeded` | Monthly usage limit exceeded |

---

## Callbacks

When you provide a `callback_url`, the API sends results to your endpoint via HTTP POST.

### Retry Policy- Maximum 5 retry attempts- Exponential backoff: 1s, 5s, 15s, 1m, 5m- 30-second timeout per request- Your endpoint should return HTTP 2xx for success
Your callback endpoint should respond with HTTP 200-299. Any other code triggers a retry.

### Callback Payload Example

```json
POST https://example.com/webhooks/checkfeature
Content-Type: application/json

{
  "request_id": "cocf_64f2d8e4_1700000123",
  "status": "completed",
  "result": {
    "company": "Stripe",
    "feature": "jQuery library",
    "has_feature": true,
    "confidence": "high",
    "evidence": "Found jQuery version 3.6.0 loaded in multiple script tags on stripe.com"
  },
  "created_at": "2025-11-10T22:20:03Z",
  "completed_at": "2025-11-10T22:20:17Z"
}
```

---

## Best Practices

Prioritize inputs in this order for best match rates:
1. **Use Domains** (Best) — Providing a domain (e.g., stripe.com) gives the most reliable results because the checker scans the actual website.2. **Company Names** (Good) — Company names (e.g., Stripe) are resolved to a domain first. Well-known companies work well; obscure names may not resolve.3. **Specific Features** (Tip) — Be as specific as possible with the feature string. &quot;jQuery library&quot; is better than &quot;JavaScript&quot;, and &quot;SOC 2 badge&quot; is better than &quot;security&quot;.
---

## Note for AI Agents
The Feature Checker API is well suited for automated pipelines that qualify leads by technology stack. AI agents should batch feature checks rather than running them one at a time, and should cache results since technology stacks change infrequently.
---

## Related APIs
- **CheckSeller API** — Verify products and services → `https://api.nyne.ai/documentation/company/checkseller`
- **Company Enrichment API** — Full company profile → `https://api.nyne.ai/documentation/company/enrichment`
- **Company Search API** — Search for companies by criteria → `https://api.nyne.ai/documentation/company/search`