Identify a comic from a photo of its cover. The photo is matched by image against every cover in the catalog (issues and variants), and the answer is catalog ids. No cover image is stored, and none comes back beyond the cover URLs the issue resource already carries.
Cover Lookup
Look up an issue by cover photo.
/api/v1/lookup/coverUpload a photo of a comic cover (bare, bagged or slabbed) as image. clear_match true means
the image match is sure of the issue: issue_id is it, and variant_id is the cover when the
match also settled which of the issue's covers it is (null is the issue's own cover, or a cover
it could not tell apart from a same-art sibling such as a newsstand edition). clear_match
false means the image was not sure: issue_id is null and candidates lists up to five
issues it could be, best first, each at its best-scoring cover. Only the image is compared;
no text is read off the cover, so a slab label's grade is not returned. Requires the
read:public scope. Rate limited separately from catalog reads: 5/min and 100/day, or
15/min and 500/day on PRO.
Request body multipart/form-data
imagefilerequiredA photo of the comic cover: JPEG, PNG, GIF, BMP or WebP, up to 5MB. Must be an image. Must not be greater than 5120 kilobytes.
Responses
200Success.
Success.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining
matched_bystringrequiredAlways
image: the answer comes from the image match.Example:
"image"clear_matchbooleanrequiredWhether the image match is sure of the issue.
Example:
trueissue_idinteger or nullrequiredThe matched issue when
clear_matchis true, otherwise null.Example:
5432variant_idinteger or nullrequiredThe matched variant cover when the match settled one, otherwise null.
Example:
789candidatesarray of objectsrequiredBest first: the matched issue alone on a clear match, otherwise up to five possibilities.
candidates[].issue_idintegerrequiredThe candidate issue.
Example:
5432candidates[].variant_idinteger or nullrequiredThe candidate's best-scoring variant cover; null is the issue's own cover.
Example:
789candidates[].issueobjectrequiredThe issue, as
GET /api/v1/issuesreturns it withinclude=series.candidates[].issue.idintegerrequiredExample:
5432candidates[].issue.slugstring or nullrequiredExample:
"amazing-spider-man-1"candidates[].issue.series_idinteger or nullrequiredExample:
123candidates[].issue.issue_numberstring or nullrequiredExample:
"1"candidates[].issue.namestring or nullrequiredExample:
"The Chameleon Strikes!"candidates[].issue.cover_datestring or nullrequiredExample:
"2018-09-01"candidates[].issue.release_datestring or nullrequiredExample:
"2018-07-11"candidates[].issue.foc_datestring or nullrequiredExample:
"2018-06-18"candidates[].issue.is_unreleasedbooleanrequiredcandidates[].issue.cover_urlstring or nullrequiredExample:
"https://...-cover_lg.webp"candidates[].issue.imagesobject or nullrequiredcandidates[].issue.images.thumbstringExample:
"https://...-thumb.webp"candidates[].issue.images.cover_smstringExample:
"https://...-cover_sm.webp"candidates[].issue.images.cover_mdstringExample:
"https://...-cover_md.webp"candidates[].issue.images.cover_lgstringExample:
"https://...-cover_lg.webp"candidates[].issue.is_reprintbooleanrequiredcandidates[].issue.content_rating_labelstring or nullrequiredExample:
"Teen"candidates[].issue.min_ageinteger or nullrequiredExample:
13candidates[].issue.is_nsfwbooleanrequiredcandidates[].issue.average_ratingnumber or nullrequiredExample:
4.5candidates[].issue.name_i18nobjectrequiredOne name per language, keyed by BCP 47 tag.
candidates[].issue.seriesobject or nullcandidates[].issue.series.idintegerrequiredExample:
123candidates[].issue.series.namestring or nullrequiredExample:
"The Amazing Spider-Man"candidates[].issue.series.slugstring or nullrequiredExample:
"the-amazing-spider-man-2018"candidates[].issue.series.start_yearinteger or nullrequiredExample:
2018candidates[].issue.series.end_yearinteger or nullrequiredExample:
2022candidates[].issue.series.volume_numberinteger or nullrequiredExample:
5candidates[].issue.series.publication_typestring or nullrequiredExample:
"regular_series"candidates[].issue.series.formatstring or nullrequiredExample:
"Standard"candidates[].issue.series.cached_issues_countinteger or nullrequiredExample:
93candidates[].issue.series.cover_urlstring or nullrequiredExample:
"https://...-cover_lg.webp"candidates[].issue.series.imagesobject or nullrequiredcandidates[].issue.series.images.cover_smstringExample:
"https://...-cover_sm.webp"candidates[].issue.series.images.cover_mdstringExample:
"https://...-cover_md.webp"candidates[].issue.series.images.cover_lgstringExample:
"https://...-cover_lg.webp"candidates[].issue.series.publisher_namestring or nullrequiredExample:
"Marvel"
401Unauthenticated. The bearer token is missing, invalid, or revoked.
Unauthenticated. The bearer token is missing, invalid, or revoked.
messagestringrequiredExample:
"Unauthenticated."
Example body, from the documented examples
{
"message": "Unauthenticated."
}403The token lacks the read:public ability.
The token lacks the read:public ability.
messagestringrequiredExample:
"Insufficient token scope."
Example body, from the documented examples
{
"message": "Insufficient token scope."
}422No photo, not an image, not one of the listed types, or over 5MB.
No photo, not an image, not one of the listed types, or over 5MB.
messagestringrequiredExample:
"The file must be a valid image."errorsobjectrequirederrors.imagearray of stringsrequiredExample:
["The file must be a valid image."]
Example body, from the documented examples
{
"message": "The file must be a valid image.",
"errors": {
"image": [
"The file must be a valid image."
]
}
}429Rate limit exceeded. This endpoint allows 5 a minute and 100 a day (free) or 15 a minute and 500 a day (PRO), and 30 a minute across every caller. Wait for the number of seconds in the Retry-After header before retrying.
Rate limit exceeded. This endpoint allows 5 a minute and 100 a day (free) or 15 a minute and 500 a day (PRO), and 30 a minute across every caller. Wait for the number of seconds in the Retry-After header before retrying.
Headers: Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining
messagestringrequiredExample:
"Too Many Attempts."
Example body, from the documented examples
{
"message": "Too Many Attempts."
}503Cover matching is unavailable right now.
Cover matching is unavailable right now.
messagestringrequiredExample:
"Cover matching is unavailable right now. Try again later or look the comic up by barcode."
Example body, from the documented examples
{
"message": "Cover matching is unavailable right now. Try again later or look the comic up by barcode."
}Example request
curl --request POST \
'https://versedb.com/api/v1/lookup/cover' \
--header 'Authorization: Bearer {YOUR_AUTH_KEY}' \
--header 'Accept: application/json' \
--form 'image=@{PATH_TO_FILE}'Example response 200
{
"matched_by": "image",
"clear_match": true,
"issue_id": 5432,
"variant_id": 789,
"candidates": [
{
"issue_id": 5432,
"variant_id": 789,
"issue": {
"id": 5432,
"slug": "amazing-spider-man-1",
"series_id": 123,
"issue_number": "1",
"name": "The Chameleon Strikes!",
"cover_date": "2018-09-01",
"release_date": "2018-07-11",
"foc_date": "2018-06-18",
"cover_url": "https://...-cover_lg.webp",
"images": {
"thumb": "https://...-thumb.webp",
"cover_sm": "https://...-cover_sm.webp",
"cover_md": "https://...-cover_md.webp",
"cover_lg": "https://...-cover_lg.webp"
},
"content_rating_label": "Teen",
"min_age": 13,
"average_rating": 4.5,
"name_i18n": {
"ja": {
"value": "講談社",
"reading": "こうだんしゃ",
"source": "madb"
}
},
"series": {
"id": 123,
"name": "The Amazing Spider-Man",
"slug": "the-amazing-spider-man-2018",
"start_year": 2018,
"end_year": 2022,
"volume_number": 5,
"publication_type": "regular_series",
"format": "Standard",
"cached_issues_count": 93,
"cover_url": "https://...-cover_lg.webp",
"images": {
"cover_sm": "https://...-cover_sm.webp",
"cover_md": "https://...-cover_md.webp",
"cover_lg": "https://...-cover_lg.webp"
},
"publisher_name": "Marvel"
}
}
}
]
}Response headers
X-RateLimit-LimitintegerRequests allowed in the current window.
X-RateLimit-RemainingintegerRequests remaining in the current window.
Retry-AfterintegerSeconds to wait before retrying.