Look up graded certificates in bulk

POST /api/v1/grading/certs/batch read:catalog 1 credit

Look up many slabs at once: a list of certificate numbers, with one provider for the body or a provider per entry. Each certificate is answered with the single lookup’s data, or its own pending or error, keyed by provider and certificate number — never by position. Use it to price an inventory, check a shipment, or warm the records before a sale; use the single GET for one slab at a time.

Uses the existing API key and read:catalog scope. Costs 1 credit per distinct certificate in the batch (X-Credits-Cost carries the total); an invalid envelope costs nothing. Limit: 10 batch calls a minute per key, with two batches in flight per key at a time.

The call is complete within waitMs whatever the graders do. A certificate the graders have not answered yet comes back pending, not as an error, and its lookup finishes behind the answer: a second call for the pending ones a few seconds later reads them from the kept record and costs its own credits.

Values (cardLadder) for PSA and CGC certificates are priced by a queue: a batch of unpriced certificates answers with their records and cardLadderStatus pending, and the values are there on a call a minute or two later. BGS values and all other data are answered inline as on the single lookup.

Every result is checked before it leaves: the record names the certificate asked for, numbers are numbers, lists are lists, and cardLadderStatus says what cardLadder shows. A record that fails that check is an internal_error for that certificate, never a half answer.

The runner on this page sends a one-certificate batch for the sample above; a real call lists up to 500.

Try it POST /api/v1/grading/certs/batch

These inputs are shared across all docs pages, so an id entered here carries over.

request body
object · 2 keys
{
  "provider": "PSA",
  "certs": [
    "164066991"
  ]
}
response
200 850ms preloaded server-side with the default context
object · 2 keys
{
  "success": true,
  "data": {
    "results": [
      {
        "provider": "PSA",
        "certNumber": "164066991",
        "requested": [
          "164066991"
        ],
        "status": "ok",
        "data": {
          "certificate": {
            "provider": "PSA",
            "certNumber": "164066991",
            "grade": "GEM MT 10",
            "gradeQualifier": null,
            "labelType": null,
            "autographGrade": null,
            "signers": null,
            "cardName": "SANJI",
            "cardSet": "ONE PIECE PREMIUM CARD COLLECTION 25TH EDITION",
            "cardNumber": "013",
            "cardYear": "2023",
            "cardVariety": null,
            "language": null,
            "imageUrl": "https://d1htnxwo4o0jhw.cloudfront.net/cert/213049068/medium/WUaiPuclk0WkFjgWaQ5qnw.jpg",
            "imageUrls": {
              "front": "https://d1htnxwo4o0jhw.cloudfront.net/cert/213049068/medium/WUaiPuclk0WkFjgWaQ5qnw.jpg",
              "back": "https://d1htnxwo4o0jhw.cloudfront.net/cert/213049068/medium/EKbeCJvD4UKPH8ka2ufUlA.jpg",
              "slabFront": "https://d1htnxwo4o0jhw.cloudfront.net/cert/213049068/medium/WUaiPuclk0WkFjgWaQ5qnw.jpg",
              "slabBack": "https://d1htnxwo4o0jhw.cloudfront.net/cert/213049068/medium/EKbeCJvD4UKPH8ka2ufUlA.jpg"
            },
            "population": {
              "total": 1572
            },
            "providerReportUrl": "https://www.psacard.com/cert/164066991/psa",
            "verificationStatus": "verified",
            "verificationConfidence": "high"
          },
          "match": {
            "status": "exact",
            "reason": null
          },
          "cardLadder": {
            "id": "2412a1b8f45f12a1adf3f933dfd1155c4ed21c82",
            "pop": null,
            "set": "One Piece Premium Card Collection 25th Edition",
            "asOf": "2026-10-17T13:27:32.520Z",
            "year": "2023",
            "grade": "10",
            "label": "2023 One Piece Premium Card Collection 25th Edition #013 Sanji",
            "number": "013",
            "player": "Sanji",
            "clValue": 45.72,
            "category": null,
            "condition": "g10",
            "thumbnail": "https://i.ebayimg.com/images/g/VbgAAeSwiGpqvTv1/s-l400.webp",
            "variation": null,
            "confidence": 5,
            "newestSale": {
              "date": "2026-10-15T01:45:00.000Z",
              "price": 46,
              "url": "https://www.ebay.com/itm/117440063647",
              "type": "Auction"
            },
            "marketValue": 46,
            "recentSales": [
              {
                "date": "2026-10-15T01:45:00.000Z",
                "price": 46,
                "url": "https://www.ebay.com/itm/117440063647",
                "type": "Auction"
              },
              {
                "date": "2026-10-14T01:40:00.000Z",
                "price": 60,
                "url": "https://www.ebay.com/itm/298735352053",
                "type": "Auction"
              },
              {
                "date": "2026-10-13T01:21:00.000Z",
                "price": 71,
                "url": "https://www.ebay.com/itm/307205544533",
                "type": "Auction"
              },
              {
                "date": "2026-10-12T16:14:58.000Z",
                "price": 98.32,
                "url": "https://www.ebay.com/itm/227464970817",
                "type": "FixedPrice"
              },
              {
                "date": "2026-10-12T01:11:00.000Z",
                "price": 54,
                "url": "https://www.ebay.com/itm/298714627556",
                "type": "Auction"
              }
            ],
            "currentValue": 45.72,
            "gradingCompany": "PSA",
            "currentListings": []
          },
          "cardLadderStatus": "found",
          "card": {
            "id": "oppr-485263",
            "name": "Sanji - OP01-013 (Alternate Art)",
            "number": "OP01-013",
            "setId": "OPPR",
            "setName": "One Piece Promotion Cards",
            "language": "en",
            "game": "onepiece",
            "type": "Character",
            "cost": "2",
            "power": "3000",
            "attribute": "Strike",
            "colors": [
              "Red"
            ],
            "rules": [
              "[Activate:Main] [Once Per Turn] You may add 1 card from your Life area to your hand: This Character gains +2000 power during this turn. Then, give this Character up to 2 rested DON!! cards."
            ],
            "subtypes": [
              "Straw Hat Crew"
            ],
            "rarity": "PR",
            "images": {
              "small": "https://api.rip.fun/storage/v1/object/public/tcg/cards/oppr-485263.large.webp",
              "large": "https://api.rip.fun/storage/v1/object/public/tcg/cards/oppr-485263.large.webp"
            },
            "isHolo": false,
            "isReverse": false,
            "isNonFoil": true,
            "isFirstEdition": false
          },
          "gradedPrice": {
            "cardId": "oppr-485263",
            "company": "PSA",
            "grade": "10",
            "price": 102.25,
            "low": 64.3,
            "mid": null,
            "high": 168.85,
            "currency": "USD",
            "timestamp": "2026-09-05T01:51:00.000Z"
          }
        }
      }
    ],
    "summary": {
      "requested": 1,
      "unique": 1,
      "ok": 1,
      "pending": 0,
      "error": 0,
      "cardLadderPending": 0
    }
  }
}
curl (tracks the inputs above)
curl -X POST 'https://service.rip.fun/api/v1/grading/certs/batch' \
  -H 'X-API-Key: rip_…' \
  -H 'Content-Type: application/json' \
  -d '{"provider":"PSA","certs":["164066991"]}'

Request fields

FieldTypeRequiredDescription
providerstring—The provider for every string entry in certs: PSA, BGS (BECKETT is accepted), CGC or TAG. Required unless every entry names its own provider.
certsarrayyes1–500 entries: a certificate number as a string (takes the body’s provider), or { provider, certNumber } for a mixed batch. Preserve leading zeroes; spaces and hyphens are normalized. The same provider and number listed twice collapses into one result whose requested array lists both entries.
waitMsnumber—How long the call waits for its lookups before answering, in milliseconds: 20000 by default, 25000 at most. Lookups still running at that point are returned as pending and finish behind the answer.

Response fields (data)

FieldDescription
data.results[]One per distinct certificate, in first-asked order: provider, certNumber, requested (the entries that asked for it) and status — ok, pending or error. Match results to your list by provider and certNumber.
data.results[].dataOn ok: exactly the single lookup’s data — certificate, match, card, gradedPrice, cardLadder and cardLadderStatus — with the same meanings and the same nulls.
data.results[].retryAfterSecondsOn pending: the lookup had not finished within waitMs; it completes behind the answer. Ask again for those certificates after this many seconds (also sent as the Retry-After header) and they answer from the kept record.
data.results[].errorOn error: the single lookup’s error code for that certificate (invalid_certificate, unsupported_provider, certificate_not_found, provider_unavailable, provider_identity_mismatch, certificate_unverified, internal_error) with httpStatus and message; a 503 carries retryAfterSeconds. One certificate’s error never fails the call.
data.summaryrequested, unique, ok, pending, error and cardLadderPending (certificates whose value is still being fetched) for the whole batch.

Errors

StatusCodeWhen
400invalid_requestNo certs array, an empty one, an entry that is neither a string nor { provider, certNumber }, or a string entry with no provider to take.
400batch_too_largeMore than 500 entries. Split the list; nothing was looked up or metered.
429rate_limitedOver 10 batch calls a minute for the key, or two batches already in flight for it. Wait for Retry-After before retrying.

See Errors for the response envelope and the full code list.