API reference

The ListingLens API lets you programmatically submit Amazon listings for analysis and retrieve structured results. Results are stored permanently and retrievable by report ID.

Authentication

Authenticate by passing your API key in the Authorization header as a Bearer token.

http
Authorization: Bearer ll_live_sk_a1b2c3d4e5f6...
API keys prefixed ll_live_ are production keys; ll_test_ keys return mocked results without consuming analysis credits.

POSThttps://api.listinglens.com/v1/analyse

Submit a listing for analysis

Submits an Amazon listing URL for full 4-agent analysis. Returns immediately with a reportId — use this to poll GET /api/results/:id or connect to the SSE stream.

Request body

ParameterTypeRequiredDescription
urlstringrequiredFull Amazon listing URL including the /dp/ path segment. ASIN is extracted server-side.
agentsstring[]optionalSubset of agents to run. Default: all four. Options: visual, reviews, ai_search, benchmark.
webhook_urlstringoptionalHTTPS URL to POST the completed report to. Useful for async workflows.
metadataobjectoptionalArbitrary key-value pairs attached to the report for your internal tracking.

cURL example

shell
curl -X POST https://api.listinglens.com/v1/analyse \
  -H "Authorization: Bearer ll_live_sk_a1b2c3d4e5f6" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.amazon.com/dp/B08N5WRWNW",
    "agents": ["visual", "reviews", "ai_search", "benchmark"]
  }'

Response

json
{
  "reportId": "rpt_abc123xyz",
  "status": "running",
  "asin": "B08N5WRWNW",
  "estimatedSeconds": 90
}

GEThttps://api.listinglens.com/v1/results/:reportId

Retrieve a completed report

Returns the full structured report for a given reportId. Reports are stored permanently — there is no expiry.

Report object

Field
Type
Description
reportId
string
Unique report identifier, prefixed rpt_
status
enum
running | complete | failed
score
number
Overall listing score 0–100. Weighted mean of agent scores.
grade
string
Letter grade (A+, A, B, C+, C, D, F) derived from score.
asin
string
Amazon ASIN extracted from submitted URL.
agents
AgentResult[]
Array of 4 agent result objects.
brief
Brief
Generated Pixii design brief. Null if synthesis not yet complete.
shareUrl
string
Permanent public URL for this report. No auth required to view.
createdAt
ISO 8601
UTC timestamp when analysis was submitted.

Agent result object

Field
Type
Description
id
string
visual | reviews | ai_search | benchmark
status
enum
complete | failed | running | waiting
score
number | null
Agent score 0–100. Null if failed.
summary
string
One-sentence summary of findings.
failed
boolean
True if the agent timed out or errored. Report is still generated without this score.
durationMs
number
Agent wall-clock time in milliseconds.

GEThttps://api.listinglens.com/v1/stream/:reportId

Subscribe to live agent events

Opens a Server-Sent Events stream that emits real-time agent progress events. The stream closes automatically once synthesis_complete is emitted.

Event types

EventData shapeDescription
agent_start{"id", "title"}An agent has begun execution.
agent_line{"id", "line"}A new log line from a running agent. Stream these to the UI for the typewriter effect.
agent_complete{"id", "score", "summary"}An agent has finished. Score and summary are available immediately.
agent_failed{"id", "reason"}An agent timed out or errored. Analysis continues with remaining agents.
synthesis_start{}All agents done; synthesis layer is running.
synthesis_complete{"reportId", "score", "grade"}Full report is ready. Fetch from GET /api/results/:id.
analysis_failed{"reason"}Unrecoverable failure (e.g. invalid ASIN, all agents timed out).

JavaScript example

javascript
// 1. Submit the listing
const res = await fetch('https://api.listinglens.com/v1/analyse', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ url: 'https://amazon.com/dp/B08N5WRWNW' }),
});
const { reportId } = await res.json();

// 2. Connect to the SSE stream
const source = new EventSource(`https://api.listinglens.com/v1/stream/${reportId}`);

source.addEventListener('synthesis_complete', async (e) => {
  const { reportId } = JSON.parse(e.data);
  source.close();
});

Status codes

200
Request succeeded. Body contains the response object.
202
Analysis submitted successfully. Not yet complete — use the stream URL or poll GET /results/:id.
400
Bad request. Missing required fields or invalid URL. Body contains a message field.
401
Missing or invalid API key. Check your Authorization header.
429
Rate limit exceeded. See Retry-After header. Default limit: 10 analyses/minute per key.
500
Internal error. Retryable errors include a retryable: true field.

Rate limits

Rate limits are applied per API key. When a limit is exceeded, the response includes a Retry-After header.

TierAnalyses / minAnalyses / dayConcurrent streams
Free102003
Pro602,00020
Enterprisecustomcustomcustom