Import Methods
Excel Import (Recommended)
Import URLs from Excel.xlsx files with full configuration options:
-
Create Excel file with columns:
URL(required) - Website URL to monitorTitle- Watch title/nameTag- Comma-separated tagsFetch Backend-html_requests,playwright,webdriver, etc.Notification URLs- Apprise notification URLsFilters- CSS/XPath selectors- Any other watch configuration fields
-
Upload via Web UI:
- Go to Import page
- Click Choose File and select your
.xlsxfile - Click Import
- Review imported watches
Excel import is recommended because it supports full configuration including tags, notifications, filters, and other watch settings.
Plaintext URL List
Import a simple list of URLs (one per line):-
Create text file with URLs:
-
Upload via Web UI:
- Go to Import page
- Paste URLs into text area (one per line)
- Click Import
-
Upload via File:
- Save URLs to
.txtfile - Upload via Import page
- Save URLs to
Plaintext import creates watches with default settings. Configure individual watches after import.
API Import
Programmatically import URLs using the REST API.Basic API Import
Import a list of URLs from plaintextRequest:Response (< 20 URLs):Response (≥ 20 URLs - background processing):
Import with Configuration
Use query parameters to configure imported watches: Available parameters:tag- Assign tag(s) to all imported watchestag_uuids- Comma-separated tag UUIDsdedupe- Skip duplicate URLs (default:true)proxy- Proxy name fromproxies.json- Any watch configuration field (see below)
Advanced Configuration Parameters
Comma-separated tags to assignExample:
Skip URLs that already exist in watchesExample:
Proxy name from proxies.jsonExample:Must match a
proxy_name defined in your proxies.json.Content processor typeAvailable processors:
text_json_diff- JSON API monitoringrestock_diff- Product restock/price monitoringtext_content_diff- Text-only comparison
Content fetcher to useAvailable fetchers:
html_requests- Fast HTTP client (default)playwright- Chrome browser via Playwrightwebdriver- Chrome browser via Seleniumsystem- Use global default
Notification URLs (comma-separated or JSON array)Example (comma-separated):Example (JSON array):
HTTP request methodValues:
GET, POST, PUT, PATCH, DELETEExample:Custom HTTP headers (JSON object)Example:
HTTP request body (for POST/PUT/PATCH)Example:
Check interval configuration (JSON object)Format:Example:
CSS/XPath selectors to include (comma-separated)Example:
CSS/XPath selectors to excludeExample:
Complete API Import Example
Background Processing
For large imports (20+ URLs), changedetection.io automatically switches to background processing:Number of URLs above which import switches to background processingBehavior:
- < 20 URLs: Synchronous import, immediate response with UUIDs
- ≥ 20 URLs: Background thread, immediate HTTP 202 response
Background imports are logged but don’t return watch UUIDs immediately. Check the watch list or logs to verify import completion.
Import from File
Import from a file on your local machine:Using cURL
Using Python
Using JavaScript/Node.js
Deduplication
By default, changedetection.io skips URLs that already exist:Skip duplicate URLs during importBehavior:
true(default) - Skip URLs that already exist in watchesfalse- Allow duplicate URLs (create multiple watches)
URL Validation
All imported URLs are validated:- Format validation: Must be valid HTTP/HTTPS URLs
- Security validation: Private/reserved IPs blocked (unless
ALLOW_IANA_RESTRICTED_ADDRESSES=true) - Protocol validation: Only
http://,https://, andfile://(if enabled) are supported
Proxy Assignment
Assign proxies during import using theproxy parameter:
Prerequisites:
- Create
proxies.jsonin datastore directory - Define proxy profiles:
Batch Import Script
Create a shell script to import URLs in batches:Troubleshooting
Import Fails with 400 Error
Cause: Invalid URL format or unsupported protocol Solution:- Check URL format:
https://example.com(notexample.com) - Ensure protocol is HTTP/HTTPS
- Remove any leading/trailing whitespace
- Check for special characters that need URL encoding
Import Returns 400 “Invalid proxy choice”
Cause: Proxy name doesn’t exist inproxies.json
Solution:
- Verify
proxies.jsonexists in datastore - Check
proxy_namematches exactly (case-sensitive) - Restart changedetection.io after modifying
proxies.json
Background Import Not Completing
Cause: Resource constraints or invalid URLs in batch Solution:- Check Docker logs:
docker logs changedetection - Look for error messages about specific URLs
- Reduce batch size
- Check available disk space and memory
Duplicates Created Despite dedupe=true
Cause: URL normalization differences (trailing slash, query params) Solution:- Normalize URLs before import (add/remove trailing slashes consistently)
- Consider using
dedupe=falseand cleaning up manually - Use API to check for duplicates first
Best Practices
- Use Excel import for initial setup with full configuration
- Test with small batch (5-10 URLs) before importing thousands
- Tag imports by date or source for easier management
- Enable deduplication to avoid duplicate watches
- Validate URLs before import using a script
- Monitor logs during large imports
- Import during low-traffic periods
- Backup datastore before large imports
- Use background processing for large batches (20+ URLs)
- Configure defaults (processor, fetch_backend) to reduce individual configuration
Related Documentation
- API Documentation - Complete API reference
- Proxy Setup - Configure proxies for imported watches
- Notifications Setup - Set up notifications during import
- Environment Variables - Import-related configuration