Skip to main content

483 Watchlist & Monitoring

Monitor FDA-regulated facilities for new citations, classification changes, and risk score changes with automated alerts.

Tier Access

Required Tier: Starter+ (Starter, Pro, Enterprise)

Rate limits apply per tier — see Rate Limits for details.

POST /v1/483/watchlist

Add a facility to your watchlist for automated monitoring.

Request

POST https://api.ctwise.ai/v1/483/watchlist
X-Api-Key: YOUR_API_KEY
Content-Type: application/json

Request Body

{
"fei_number": "3005012345",
"legal_name": "Acme Pharmaceutical Manufacturing",
"webhook_url": "https://api.yourcompany.com/webhooks/fda-alerts",
"alert_on": ["new_citation", "classification_change", "risk_score_change"]
}

Parameters

ParameterTypeRequiredDescription
fei_numberstringYesFDA Establishment Identifier
legal_namestringNoFacility legal name for reference
webhook_urlstringNoHTTPS webhook URL for real-time alerts
alert_onstring[]NoAlert types to monitor (defaults to all three)

Alert Types

Alert TypeDescription
new_citationNew FDA 483 citation issued to facility
classification_changeInspection classification changed (e.g., VAI to OAI)
risk_score_changeFacility risk score changed significantly

Response

Status: 201 Created

{
"watchlist_id": "wl_5356aba919a14c25",
"tenant_id": "default-tenant",
"fei_number": "3005012345",
"legal_name": "Acme Pharmaceutical Manufacturing",
"webhook_url": "https://api.yourcompany.com/webhooks/fda-alerts",
"alert_on": ["new_citation", "classification_change", "risk_score_change"],
"created_at": "2026-02-23T18:30:00.123456+00:00"
}

Response Fields

FieldTypeDescription
watchlist_idstringUnique watchlist entry identifier (format: wl_<hex>)
tenant_idstringTenant that owns this watchlist entry
fei_numberstringFDA Establishment Identifier
legal_namestringFacility legal name (or null if not provided)
webhook_urlstringConfigured webhook URL (or null)
alert_onstring[]Alert types configured for this entry
created_atstringEntry creation timestamp (ISO 8601)

GET /v1/483/watchlist

Retrieve your current watchlist entries with pagination.

Request

GET https://api.ctwise.ai/v1/483/watchlist?limit=20&offset=0
X-Api-Key: YOUR_API_KEY

Query Parameters

ParameterTypeRequiredDescription
limitintegerNoMaximum results to return (default: 20, max: 100)
offsetintegerNoNumber of results to skip (default: 0)

Response

{
"results": [
{
"watchlist_id": "wl_5356aba919a14c25",
"fei_number": "3005012345",
"legal_name": "Acme Pharmaceutical Manufacturing",
"webhook_url": "https://api.yourcompany.com/webhooks/fda-alerts",
"alert_on": ["new_citation", "classification_change", "risk_score_change"],
"created_at": "2026-02-23T18:30:00.123456+00:00",
"last_checked": null
}
],
"total": 1,
"offset": 0,
"limit": 20,
"query_metadata": {
"execution_time_ms": 45
}
}

Response Fields

FieldTypeDescription
resultsarrayArray of watchlist entries
results[].watchlist_idstringUnique entry identifier
results[].fei_numberstringFDA Establishment Identifier
results[].legal_namestringFacility legal name
results[].webhook_urlstringWebhook URL (or null)
results[].alert_onstring[]Alert types
results[].created_atstringCreation timestamp
results[].last_checkedstringLast alert check timestamp (or null)
totalintegerTotal entries for tenant
offsetintegerCurrent offset
limitintegerPage size
query_metadataobjectExecution metadata

DELETE /v1/483/watchlist/{id}

Remove a watchlist entry and stop monitoring.

Request

DELETE https://api.ctwise.ai/v1/483/watchlist/wl_5356aba919a14c25
X-Api-Key: YOUR_API_KEY

Path Parameters

ParameterTypeRequiredDescription
idstringYesWatchlist entry ID to delete

Response

{
"deleted": true,
"watchlist_id": "wl_5356aba919a14c25"
}

Examples

Add Facility to Watchlist

curl -X POST "https://api.ctwise.ai/v1/483/watchlist" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fei_number": "3005012345",
"legal_name": "Key Supplier - API Manufacturing",
"webhook_url": "https://api.yourcompany.com/webhooks/fda",
"alert_on": ["new_citation", "classification_change"]
}'

Get Watchlist

curl -X GET "https://api.ctwise.ai/v1/483/watchlist" \
-H "X-Api-Key: YOUR_API_KEY"

Delete Watchlist Entry

curl -X DELETE "https://api.ctwise.ai/v1/483/watchlist/wl_5356aba919a14c25" \
-H "X-Api-Key: YOUR_API_KEY"

Python Example - Add and Monitor

import requests

API_KEY = "your_api_key"
BASE_URL = "https://api.ctwise.ai/v1"

# Add facility to watchlist
response = requests.post(
f"{BASE_URL}/483/watchlist",
headers={
"X-Api-Key": API_KEY,
"Content-Type": "application/json"
},
json={
"fei_number": "3005012345",
"legal_name": "Primary API Supplier",
"webhook_url": "https://api.yourcompany.com/webhooks/fda-alerts",
"alert_on": ["new_citation", "classification_change", "risk_score_change"]
}
)

entry = response.json()
print(f"Watchlist entry created: {entry['watchlist_id']}")
print(f"Monitoring FEI: {entry['fei_number']}")
print(f"Alerts: {', '.join(entry['alert_on'])}")

# List all watchlist entries
response = requests.get(
f"{BASE_URL}/483/watchlist",
headers={"X-Api-Key": API_KEY}
)

data = response.json()
print(f"\nMonitoring {data['total']} facilities:")
for item in data['results']:
print(f" {item['fei_number']} - {item['legal_name'] or 'No name'}")

JavaScript Example - CRUD Operations

const API_KEY = 'your_api_key';
const BASE_URL = 'https://api.ctwise.ai/v1';

// Add to watchlist
const createResponse = await fetch(`${BASE_URL}/483/watchlist`, {
method: 'POST',
headers: {
'X-Api-Key': API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
fei_number: '3005012345',
legal_name: 'Critical Supplier',
alert_on: ['new_citation', 'classification_change']
})
});

const entry = await createResponse.json();
console.log(`Created: ${entry.watchlist_id}`);

// List watchlist
const listResponse = await fetch(`${BASE_URL}/483/watchlist`, {
headers: { 'X-Api-Key': API_KEY }
});

const data = await listResponse.json();
console.log(`Monitoring ${data.total} facilities`);

// Delete entry
const deleteResponse = await fetch(
`${BASE_URL}/483/watchlist/${entry.watchlist_id}`,
{
method: 'DELETE',
headers: { 'X-Api-Key': API_KEY }
}
);

const result = await deleteResponse.json();
console.log(`Deleted: ${result.deleted}`);

Error Responses

Missing FEI Number

{
"error": "'fei_number' is required",
"status_code": 400
}

Status: 400 Bad Request

Invalid Webhook URL

{
"error": "'webhook_url' must be an HTTPS URL",
"status_code": 400
}

Status: 400 Bad Request

Invalid Alert Types

{
"error": "Invalid alert_on values: {'invalid_type'}. Valid: {'new_citation', 'classification_change', 'risk_score_change'}",
"status_code": 400
}

Status: 400 Bad Request

Watchlist Entry Not Found

{
"error": "Watchlist entry 'wl_nonexistent' not found",
"status_code": 404
}

Status: 404 Not Found

Performance

MetricTarget
Create response time< 2 seconds
List response time< 2 seconds
Delete response time< 2 seconds
Data storageS3 JSONL (durable, versioned)
Timeout30 seconds

Best Practices

  1. One entry per facility - Each POST creates a single watchlist entry for one FEI number
  2. Webhook reliability - Ensure your webhook endpoint returns 200 OK within 5 seconds
  3. Alert selection - Be selective with alert_on types to reduce noise
  4. Periodic review - Periodically review and clean up your watchlist as supplier relationships change