A fast, reliable batch-processing tool for verifying Point of Interest (POI) names against geolocation APIs. Perfect for data validation, deduplication, and location verification workflows.
Try the app here: https://duplicate-pois-checker.onrender.com
- Upload an Excel file with
POI_Namecolumn - Enter your geolocation API token
- Click "Start Processing"
- Download results as Excel
- π Batch Processing - Check thousands of POIs in minutes
- π Multi-Format Support - Excel (.xlsx, .xls) and CSV files
- βΈοΈ Resume Capability - Pause and resume without reprocessing
- π VPN Relay Support - Access WAF-protected APIs securely
- πΎ Session Persistence - Auto-saves progress, never lose data
- π Real-Time Stats - Live dashboard with progress tracking
- π₯ Export Results - Download as Excel with one click
- π Auto-Cleanup - Configurable session retention
- β‘ Async Operations - Non-blocking API calls for speed
- Quick Start
- Installation
- Configuration
- Usage
- VPN Relay Setup
- Deployment
- API Documentation
- Contributing
- Troubleshooting
- License
- Python 3.8 or higher
- Turso Database account (free tier available)
- API token for your geolocation service
# Clone the repository
git clone https://github.com/the-ripper77/Duplicate-POIs-Checker.git
cd Duplicate-POIs-Checker
# Install dependencies
pip install -r requirements.txtCreate a .env file in the project root:
# Turso Database (Get from turso.tech)
TURSO_DATABASE_URL=libsql://your-db-name.turso.tech
TURSO_AUTH_TOKEN=your_auth_token_here
# Your Geolocation API
API_BASE=https://your-api.com/api/search?name=
# VPN Relay (Optional - for WAF-protected APIs)
RELAY_URL=https://your-ngrok-url.ngrok.io
RELAY_SECRET=your-secret-key-herepython main.pyVisit http://localhost:8000 in your browser.
- Click "Upload Excel/CSV File"
- Select file with
POI_Namecolumn - Confirm upload
- Paste your geolocation API bearer token
- Click "Start Processing"
- Watch real-time stats on the dashboard
- See Total / Found / Not Found / Pending counts
- Click "Download Results" when done
- Excel file with columns:
POI_Name,Found,Found_Name
For APIs behind WAF with VPN-only access:
Open 3 terminals:
Terminal 1 - Start Relay Server:
python relay_server.py
# Output: Listening on 0.0.0.0:8001Terminal 2 - Expose with ngrok:
ngrok http 8001
# Copy the forwarding URL: https://xxx.ngrok.ioTerminal 3 - Connect OpenVPN:
Open OpenVPN software and connect to your configuration
Add environment variables:
RELAY_URL=https://xxx.ngrok.io(from ngrok)RELAY_SECRET= same secret from your.env
Done! Your Render app now accesses your API through your VPN. π
# 1. Push to GitHub
git push origin main
# 2. Go to render.com
# 3. Create Web Service from your GitHub repo
# 4. Add environment variables
# 5. Deploy!Startup Command: python main.py
docker build -t poi-checker .
docker run -p 8000:8000 --env-file .env poi-checkerSimilar process - connect GitHub repo, add env vars, deploy!
Upload Excel or CSV file with POI data.
Request:
multipart/form-data: file
Cookie: session_id (auto-generated)
Response:
{
"success": true,
"count": 150,
"message": "Successfully loaded 150 POIs",
"resume": false
}Check a single POI against the API.
Request:
Form: poi_id, api_token
Cookie: session_id
Response:
{
"id": 1,
"poi_name": "Kathmandu Valley",
"found": "Yes",
"found_name": "Kathmandu Valley, Bagmati, Nepal"
}Get progress statistics.
Response:
{
"stats": {
"total": 150,
"found": 95,
"not_found": 42,
"pending": 13
},
"pois": [...]
}Download results as Excel file.
Clear all results for current session.
Test API connection with a single POI.
| Layer | Technology |
|---|---|
| Backend | FastAPI, Uvicorn |
| Database | Turso (SQLite HTTP) |
| Async | aiohttp |
| Data Processing | Pandas |
| Frontend | HTML5, Vanilla JS, Tailwind CSS |
| Infrastructure | Render, Turso, ngrok |
Ensure your file has a column exactly named POI_Name (case-sensitive).
- β
Check
relay_server.pyis running - β Check ngrok tunnel is active
- β
Verify
RELAY_URLin Render environment
- β OpenVPN disconnected? Reconnect.
- β
Is
relay_server.pystill running? Restart it. - β Check your computer internet connection.
- Verify API is responding: Use
/test-api/endpoint - Check network latency to your API
- Consider increasing batch size in
api.py
Clear browser cookies or open in private/incognito mode.
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
# Clone your fork
git clone https://github.com/YOUR_USERNAME/Duplicate-POIs-Checker.git
# Install dev dependencies
pip install -r requirements.txt
# Run locally
python main.py
- Follow PEP 8
- Use type hints where possible
- Write docstrings for functions
- Add comments for complex logic
CREATE TABLE pois (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT NOT NULL,
poi_name TEXT,
found TEXT DEFAULT '',
found_name TEXT DEFAULT '',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_session_id ON pois(session_id);| Variable | Required | Description |
|---|---|---|
TURSO_DATABASE_URL |
Yes | Turso database URL |
TURSO_AUTH_TOKEN |
Yes | Turso authentication token |
API_BASE |
Yes | Geolocation API endpoint |
RELAY_URL |
No | ngrok relay URL (for VPN) |
RELAY_SECRET |
No | Relay authentication secret |
RELAY_PORT |
No | Relay server port (default: 8001) |
Change session retention:
# In main.py
await cleanup_old_sessions(days=14) # Default: 7 daysModify batch size:
# In api.py
batch_size = 100 # Default: 50Adjust API timeout:
# In api.py
timeout=aiohttp.ClientTimeout(total=60) # Default: 50 seconds| Metric | Value |
|---|---|
| Batch size | 50-100 POIs |
| API timeout | 50-60 seconds |
| Session retention | 7 days (configurable) |
| Max file size | Limited by server memory |
| Concurrent users | Unlimited (session-isolated) |
Throughput Examples:
- 1,000 POIs: ~10 minutes (100ms per API call)
- 5,000 POIs: ~50 minutes
- Parallelizable with worker processes
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Copyright 2026 Duplicate POI Checker Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
- the-ripper77 - Initial work - GitHub
- π Issues - GitHub Issues
- π¬ Discussions - GitHub Discussions
- π§ Email - Open an issue for contact
Give a βοΈ if this project helped you!


