Skip to main content

GET /api/v1/jobs/:jobId

Check the status of a review scraping job.

Request

Headers:
HeaderValueRequired
AuthorizationBearer YOUR_API_KEYYes
Path Parameters:
ParameterTypeDescription
jobIdnumberJob ID from POST /reviews/refresh

Response (200 OK)

{
  "jobId": 2877,
  "asin": "B08N5WRWNW",
  "productTitle": "Example Product Title",
  "status": "completed",
  "createdAt": "2026-02-02T10:30:00.000Z",
  "updatedAt": "2026-02-02T10:31:05.000Z"
}
FieldTypeDescription
jobIdnumberJob identifier
asinstringASIN being processed
productTitlestringProduct title (if available)
statusstringqueued | processing | completed | failed
createdAtstringISO 8601 timestamp of job creation
updatedAtstringISO 8601 timestamp of last status change

Job Statuses

StatusDescription
queuedJob is waiting to be processed
processingJob is actively scraping reviews
completedJob finished successfully (reviews now cached)
failedJob failed (check error field for details)

Errors

StatusErrorCause
400Invalid job IDjobId is not a valid number
401Invalid API keyKey doesn’t exist or was revoked
404Job not foundJob doesn’t exist or belongs to another store

Examples

cURL:
curl https://app.descripio.com/api/v1/jobs/2877 \
  -H "Authorization: Bearer dscr_abc123..."
Python (with polling):
import requests
import time

API_KEY = "dscr_abc123..."
job_id = 2877
max_attempts = 24  # 2 minutes max

for attempt in range(max_attempts):
    response = requests.get(
        f"https://app.descripio.com/api/v1/jobs/{job_id}",
        headers={"Authorization": f"Bearer {API_KEY}"}
    )
    
    job = response.json()
    status = job["status"]
    
    if status == "completed":
        print(f"✅ Job complete! Fetching reviews...")
        break
    elif status == "failed":
        print(f"❌ Job failed")
        break
    else:
        print(f"⏳ Status: {status}, waiting...")
        time.sleep(5)
else:
    print("⚠️ Timeout: Job took longer than expected")
JavaScript (with polling):
async function pollJob(jobId, apiKey) {
  const maxAttempts = 24;
  
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
    const response = await fetch(
      `https://app.descripio.com/api/v1/jobs/${jobId}`,
      { headers: { 'Authorization': `Bearer ${apiKey}` } }
    );
    
    const job = await response.json();
    
    if (job.status === 'completed') {
      console.log('Job complete!');
      return job;
    } else if (job.status === 'failed') {
      throw new Error('Job failed');
    }
    
    console.log(`Status: ${job.status}, waiting...`);
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
  
  throw new Error('Timeout');
}

Best Practices

  • Poll interval: Start with 5 seconds, use exponential backoff if needed
  • Max timeout: Set a reasonable limit (2-3 minutes) to avoid infinite loops
  • Error handling: Always check for failed status and handle gracefully