PSA API endpoint
Use Crawlora's PSA CardFacts checklist API to extract supported public PSA data as structured JSON. This page includes request parameters, cURL examples, response schema, error behavior, credit cost, and a Playground link for testing before integration.
/psa/cardfacts/checklistOne set's full card checklist: every card's name and printed number (number is empty for sets PSA lists without one, e.g. many autograph/player-only card sets). set_id is the numeric id from a psa-cardfacts-sets result. Developers commonly use this endpoint for data enrichment, monitoring, research dashboards, internal automation, and agent-native workflows that need repeatable structured public web data. Authentication uses the documented Crawlora headers, and usage is metered with the credit cost shown on this page.
Request parameters are generated from the active endpoint catalog. Required values must be sent before Crawlora can call the upstream public web data source.
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| set_id | string | Yes | Numeric set id, from a psa-cardfacts-sets result | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/psa/cardfacts/checklist" \ -H "x-api-key: $CRAWLORA_API_KEY"
Send your scraping API key in the x-api-key header. Use the console API Keys page to rotate or select the active key.
Endpoint usage is metered in credits. The plan prices, included credits, limits, and overage rates below match the active backend billing configuration.
| Plan | Price | Included credits | Daily cap | Rate limit | Overage |
|---|---|---|---|---|---|
| Free | $0/mo | 2,000 | 500 daily credits | 5/min | No overage |
| Starter | $9/mo | 20,000 | 5,000 daily credits | 15/min | $0.75/1,000 overage credits when enabled |
| Growth | $29/mo | 100,000 | 25,000 daily credits | 45/min | $0.45/1,000 overage credits when enabled |
| Pro | $79/mo | 400,000 | No daily cap | 120/min | $0.30/1,000 overage credits |
| Business | $199/mo | 1,200,000 | No daily cap | 300/min | $0.20/1,000 overage credits |
| Enterprise | $499/mo | 5,000,000 | No daily cap | 1,000/min | $0.12/1,000 overage credits |
This endpoint is executed through Crawlora's managed scraping infrastructure.
- `number` is empty for sets PSA lists without a printed card number (confirmed live, e.g. many autograph/player-only card sets) — always present, never omitted, so callers can rely on the field always being there. - The full checklist is returned in one request regardless of set size — confirmed live that PSA's own server-side page-size cap sits well above every observed set (largest seen: 661 cards). - A `set_id` PSA cannot resolve returns a `200` with an empty `cards` array and `total_cards: 0`, not an error. Example response: ```json { "code": 200, "msg": "OK", "data": { "set_id": "34071", "total_cards": 661, "has_checklist": true, "cards": [ { "name": "Shohei Ohtani", "number": "1" }, { "name": "Craig Kimbrel", "number": "2" } ] } } ```
Crawlora does not silently return bad data when the upstream page cannot be used.
| Status | Common failure case |
|---|---|
| 400 | Invalid input or missing required parameter |
| 429 | Plan or endpoint rate limit exceeded |
| 500 | Internal execution error |
| 502 | Upstream platform failed, returned unusable HTML, or served a challenge page that could not be resolved |
When possible, Crawlora returns structured error context so your integration can retry, back off, or inspect the request.
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
{
"code": 200,
"msg": "OK",
"data": {
"set_id": "34071",
"total_cards": 661,
"has_checklist": true,
"cards": [
{
"name": "Shohei Ohtani",
"number": "1"
},
{
"name": "Craig Kimbrel",
"number": "2"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/psa.cardFactsChecklistResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | psa.CardFactsChecklistResponse | No | ||||
| data.cards | array | No | ||||
| data.cards[].name | string | No | Name is the card's display name, e.g. "Wander Franco". Some rows carry an embedded HTML anchor around the name in PSA's own raw response (confirmed live, e.g. a golf set's "Tiger Woods" row) -- stripped here so every row is plain text. | |||
| data.cards[].number | string | No | Number is the card's printed number within the set. Some sets (e.g. player-name-only checklists like autograph card sets) carry no number at all, confirmed live -- empty in that case, not omitted, so callers can rely on the field always being present. | |||
| data.has_checklist | boolean | No | ||||
| data.set_id | string | No | ||||
| data.total_cards | integer | No | ||||
| msg | string | No | OK |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/psa/cardfacts/checklist" \
-H "x-api-key: $CRAWLORA_API_KEY"Crawlora is designed for responsible structured public web data workflows. Customers are responsible for using Crawlora in compliance with applicable laws, third-party rights, target-platform rules, and Crawlora terms.
Read Crawlora terms