A FastAPI service for clustering keywords based on common SERP URLs. Upload ValueSERP export data and receive JSON clusters.
- REST API for SERP clustering
- Configurable common URL threshold
- JSON response format
- Built-in API documentation (Swagger UI)
pip install -r requirements.txtuvicorn app:app --reloadOr run directly:
python app.pyServer starts at http://localhost:8000
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
Returns API information.
Upload a CSV file for clustering.
Parameters:
file: CSV file (required) - ValueSERP exportcommon_urls: int (optional, default: 4) - Minimum common URLs to form cluster
CSV Format: Must contain columns:
search.q- The search queryresult.organic_results.link- The ranking URL
Example Request:
curl -X POST "http://localhost:8000/cluster-serps?common_urls=4" \
-H "Content-Type: multipart/form-data" \
-F "file=@Batch_Results.csv"Example Response:
{
"serp_clusters": [
{
"cluster": 1,
"similar_query": "running shoes",
"queries": ["best running shoes", "top running shoes"],
"common_urls_counts": [5, 4],
"common_urls": ["https://example.com/shoes", "..."]
}
],
"total_clusters": 1,
"common_urls_threshold": 4
}import requests
files = {'file': open('Batch_Results.csv', 'rb')}
response = requests.post(
'http://localhost:8000/cluster-serps',
files=files,
params={'common_urls': 4}
)
clusters = response.json()const formData = new FormData();
formData.append('file', fileInput.files[0]);
const response = await fetch('http://localhost:8000/cluster-serps?common_urls=4', {
method: 'POST',
body: formData
});
const clusters = await response.json();FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]For production, use gunicorn with uvicorn workers:
gunicorn app:app -w 4 -k uvicorn.workers.UvicornWorkerLee Foot - eCommerce SEO Consultant