{"openapi":"3.1.0","info":{"title":"Centering Lab API","version":"1.1.2","description":"Card centering measurement and published grading thresholds. Free access with no API key. Public REST endpoints allow cross-origin browser fetch without credentials (Access-Control-Allow-Origin: *); IP quotas still apply. Images are processed only in memory. This is a ceiling from centering alone, not a prediction of the final grade."},"servers":[{"url":"https://centeringlab.com"}],"security":[],"paths":{"/api/v1/grade":{"post":{"operationId":"grade_centering","summary":"Grade known centering ratios","description":"Return centering ceilings for PSA/BGS/CGC/SGC; optional house limits output. Keys: front_lr, front_tb, back_lr, back_tb, house. Example: {\"front_lr\":\"55/45\",\"front_tb\":\"60/40\"}. Accept percentages (55), fractions (0.55), or pairs summing to 100 or 1; / - – — : x or spaces, optional %. Scalar 1 is ambiguous and rejected. L/R or left/right suffixes require *_lr; T/B or top/bottom require *_tb. Fractions are disclosed in normalizations. At least one axis required. Missing axes/faces may lower ceilings; BGS uses both axes. Not a grade prediction.","x-openai-isConsequential":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"front_lr":{"anyOf":[{"type":"number","const":0},{"type":"number","exclusiveMinimum":0,"exclusiveMaximum":1},{"type":"number","exclusiveMinimum":1,"maximum":100},{"type":"string","minLength":1,"maxLength":80}],"description":"A percentage within 0–100 (55 or 45; 1 is ambiguous and rejected), a fraction between 0 and 1 (0.55), or a pair summing to 100 or 1. Separators: / - – — : x or spaces; optional %. Axis suffix L/R or left/right for *_lr, T/B or top/bottom for *_tb. Normalized to the larger side; fractions are disclosed in normalizations."},"front_tb":{"anyOf":[{"type":"number","const":0},{"type":"number","exclusiveMinimum":0,"exclusiveMaximum":1},{"type":"number","exclusiveMinimum":1,"maximum":100},{"type":"string","minLength":1,"maxLength":80}],"description":"A percentage within 0–100 (55 or 45; 1 is ambiguous and rejected), a fraction between 0 and 1 (0.55), or a pair summing to 100 or 1. Separators: / - – — : x or spaces; optional %. Axis suffix L/R or left/right for *_lr, T/B or top/bottom for *_tb. Normalized to the larger side; fractions are disclosed in normalizations."},"back_lr":{"anyOf":[{"type":"number","const":0},{"type":"number","exclusiveMinimum":0,"exclusiveMaximum":1},{"type":"number","exclusiveMinimum":1,"maximum":100},{"type":"string","minLength":1,"maxLength":80}],"description":"A percentage within 0–100 (55 or 45; 1 is ambiguous and rejected), a fraction between 0 and 1 (0.55), or a pair summing to 100 or 1. Separators: / - – — : x or spaces; optional %. Axis suffix L/R or left/right for *_lr, T/B or top/bottom for *_tb. Normalized to the larger side; fractions are disclosed in normalizations."},"back_tb":{"anyOf":[{"type":"number","const":0},{"type":"number","exclusiveMinimum":0,"exclusiveMaximum":1},{"type":"number","exclusiveMinimum":1,"maximum":100},{"type":"string","minLength":1,"maxLength":80}],"description":"A percentage within 0–100 (55 or 45; 1 is ambiguous and rejected), a fraction between 0 and 1 (0.55), or a pair summing to 100 or 1. Separators: / - – — : x or spaces; optional %. Axis suffix L/R or left/right for *_lr, T/B or top/bottom for *_tb. Normalized to the larger side; fractions are disclosed in normalizations."},"house":{"description":"Optional: return only this grading house.","type":"string","enum":["PSA","BGS","CGC","SGC"]}},"additionalProperties":false,"anyOf":[{"required":["front_lr"]},{"required":["front_tb"]},{"required":["back_lr"]},{"required":["back_tb"]}]}}}},"responses":{"200":{"description":"Centering result. Always distinguish a centering ceiling from a grade prediction.","content":{"application/json":{"schema":{"type":"object","properties":{"front":{"anyOf":[{"type":"object","properties":{"ratios":{"type":"object","properties":{"lr":{"type":["number","null"]},"tb":{"type":["number","null"]}},"required":["lr","tb"],"additionalProperties":false},"missing_axes":{"type":"array","items":{"type":"string","enum":["lr","tb"]}},"ceilings":{"type":"object","properties":{"PSA":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"BGS":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"CGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"SGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false}},"additionalProperties":false}},"required":["ratios","missing_axes","ceilings"],"additionalProperties":false},{"type":"null"}]},"back":{"anyOf":[{"type":"object","properties":{"ratios":{"type":"object","properties":{"lr":{"type":["number","null"]},"tb":{"type":["number","null"]}},"required":["lr","tb"],"additionalProperties":false},"missing_axes":{"type":"array","items":{"type":"string","enum":["lr","tb"]}},"ceilings":{"type":"object","properties":{"PSA":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"BGS":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"CGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"SGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false}},"additionalProperties":false}},"required":["ratios","missing_axes","ceilings"],"additionalProperties":false},{"type":"null"}]},"combined":{"type":"object","properties":{"PSA":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"BGS":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"CGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"SGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false}},"additionalProperties":false},"normalizations":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["front_lr","front_tb","back_lr","back_tb"]},"input":{"type":["number","string"]},"ratio":{"type":"string"},"note":{"type":"string"}},"required":["field","input","ratio","note"],"additionalProperties":false}},"incomplete":{"type":"boolean"},"missing_faces":{"type":"array","items":{"type":"string","enum":["front","back"]}},"summary":{"type":"string"},"disclaimer":{"type":"string"}},"required":["front","back","combined","normalizations","incomplete","missing_faces","summary","disclaimer"],"additionalProperties":false}}}},"400":{"description":"Invalid input, unsafe image URL or unsupported image.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"403":{"description":"Unrecognized Host header.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"405":{"description":"Use the documented HTTP method.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"413":{"description":"Request/image byte limit or decoded pixel limit exceeded.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"415":{"description":"Send uncompressed application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}}},"500":{"description":"Internal error; retry or direct the user to the website.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"503":{"description":"Measurement queue or request capacity full. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}}},"504":{"description":"Image download or measurement timed out.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}}}}},"/api/v1/standards":{"get":{"operationId":"get_centering_standards","summary":"Get centering standards and sources","description":"Look up card centering thresholds for PSA, BGS, CGC and SGC, optionally by house and front/back. Use for threshold/rules questions and source checks. Returns per-band official/interpreted/approximate status, source links, verification date/provenance and rounding rule. TAG is excluded. These are centering ceilings, not grade predictions.","parameters":[{"name":"house","in":"query","required":false,"schema":{"type":"string","enum":["PSA","BGS","CGC","SGC"]}},{"name":"face","in":"query","required":false,"schema":{"type":"string","enum":["front","back"]}}],"responses":{"200":{"description":"Centering result. Always distinguish a centering ceiling from a grade prediction.","content":{"application/json":{"schema":{"type":"object","properties":{"standards":{"type":"array","items":{"type":"object","properties":{"house":{"type":"string","enum":["PSA","BGS","CGC","SGC"]},"face":{"type":"string","enum":["front","back"]},"bands":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number"},"label":{"type":"string"},"rank":{"type":"number"},"loose":{"type":"number"},"tight":{"type":"number"},"status":{"type":"string","enum":["official","interpreted","approximate"]}},"required":["value","label","rank","loose","status"],"additionalProperties":false}},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["official","interpreted","approximate"]},"verified":{"type":"string"},"verification":{"type":"string"},"note":{"type":"string"}},"required":["house","face","bands","source","sources","status","verified","verification","note"],"additionalProperties":false}},"rounding_rule":{"type":"string"},"tag_note":{"type":"string"},"summary":{"type":"string"},"disclaimer":{"type":"string"}},"required":["standards","rounding_rule","tag_note","summary","disclaimer"],"additionalProperties":false}}}},"400":{"description":"Invalid input, unsafe image URL or unsupported image.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"403":{"description":"Unrecognized Host header.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"405":{"description":"Use the documented HTTP method.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"413":{"description":"Request/image byte limit or decoded pixel limit exceeded.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"415":{"description":"Send uncompressed application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}}},"500":{"description":"Internal error; retry or direct the user to the website.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"503":{"description":"Measurement queue or request capacity full. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}}},"504":{"description":"Image download or measurement timed out.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}}}}},"/api/v1/measure":{"post":{"operationId":"measure_card_centering","summary":"Measure one card photograph","description":"Measure worst-station left/right and top/bottom card centering from one photograph. Ask front or back before calling. Request a whole card, flat on a dark surface, straight from above and out of its sleeve. The photo is processed on the server in memory and discarded, unlike the local-only website. Use a public HTTPS URL or image bytes supported by the client. If a chat attachment cannot be passed to this remote tool, send the user to https://centeringlab.com/. needs-review or failed means no grade ceilings: suggest a retake or manual website adjustment. Never predict a final grade. Supply exactly one image_url, raw image_base64, or runtime openaiFileIdRefs object. For GPT Action configuration import /api/v1/openapi-gpt.json instead.","x-openai-isConsequential":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"face":{"type":"string","enum":["front","back"],"description":"Required: ask the user whether the photo shows the front or back if unclear."},"card_size":{"default":"standard","description":"standard = 63×88 mm; small = 59×86 mm.","type":"string","enum":["standard","small"]},"image_url":{"description":"Public HTTPS image URL, port 443. Private network addresses and non-image responses are rejected.","type":"string","maxLength":8192,"format":"uri"},"image_base64":{"description":"Raw base64 encoded raster image, without a data-URL prefix. Intended for clients that can supply image bytes.","type":"string","minLength":4,"maxLength":12582912},"openaiFileIdRefs":{"description":"GPT Actions runtime file references. Exactly one card photograph.","minItems":1,"maxItems":1,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":1024},"id":{"type":"string","minLength":1,"maxLength":1024},"mime_type":{"type":"string","maxLength":100,"pattern":"^image\\/"},"download_link":{"type":"string","maxLength":8192,"format":"uri"}},"required":["name","id","mime_type","download_link"],"additionalProperties":false}}},"required":["face"],"additionalProperties":false,"oneOf":[{"required":["image_url"]},{"required":["image_base64"]},{"required":["openaiFileIdRefs"]}]}}}},"responses":{"200":{"description":"Centering result. Always distinguish a centering ceiling from a grade prediction.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","needs-review","failed"]},"code":{"type":"string"},"face":{"type":"string","enum":["front","back"]},"card_size":{"type":"string","enum":["standard","small"]},"lr":{"anyOf":[{"type":"object","properties":{"ratio":{"type":"string"},"major_percent":{"type":"number"},"minor_percent":{"type":"number"},"uncertainty_pp":{"type":"number"},"sigma_pp":{"type":"number"},"worst_station_px":{"type":"number"},"stations_major_percent":{"type":"array","items":{"type":"number"}}},"required":["ratio","major_percent","minor_percent","uncertainty_pp","sigma_pp","worst_station_px","stations_major_percent"],"additionalProperties":false},{"type":"null"}]},"tb":{"anyOf":[{"type":"object","properties":{"ratio":{"type":"string"},"major_percent":{"type":"number"},"minor_percent":{"type":"number"},"uncertainty_pp":{"type":"number"},"sigma_pp":{"type":"number"},"worst_station_px":{"type":"number"},"stations_major_percent":{"type":"array","items":{"type":"number"}}},"required":["ratio","major_percent","minor_percent","uncertainty_pp","sigma_pp","worst_station_px","stations_major_percent"],"additionalProperties":false},{"type":"null"}]},"confidence":{"anyOf":[{"type":"number","minimum":0,"maximum":1},{"type":"null"}]},"warnings":{"type":"array","items":{"type":"string"}},"ceilings":{"anyOf":[{"type":"object","properties":{"PSA":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"BGS":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"CGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false},"SGC":{"type":"object","properties":{"maximum_grade":{"type":["number","null"]},"label":{"type":["string","null"]},"rank":{"type":["number","null"]},"limiting_face":{"type":"string","enum":["front","back"]},"limiting_axis":{"type":"string","enum":["lr","tb"]},"distance_to_next":{"type":["number","null"]},"next_grade":{"type":["number","null"]},"next_label":{"type":["string","null"]},"borderline":{"type":"boolean"},"unconstrained":{"type":"boolean"},"source_status":{"type":"string","enum":["official","interpreted","approximate"]},"standard_status":{"type":"string","enum":["official","interpreted","approximate"]},"source":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"verified":{"type":"string"},"verification":{"type":"string"}},"required":["maximum_grade","label","rank","limiting_face","limiting_axis","distance_to_next","next_grade","next_label","borderline","unconstrained","source_status","standard_status","source","sources","verified","verification"],"additionalProperties":false}},"required":["PSA","BGS","CGC","SGC"],"additionalProperties":false},{"type":"null"}]},"adjust_url":{"type":"string"},"advice":{"type":"string"},"elapsed_ms":{"type":"number"},"image_bytes":{"type":"number"},"summary":{"type":"string"},"disclaimer":{"type":"string"}},"required":["status","code","face","card_size","lr","tb","confidence","warnings","ceilings","adjust_url","advice","elapsed_ms","image_bytes","summary","disclaimer"],"additionalProperties":false}}}},"400":{"description":"Invalid input, unsafe image URL or unsupported image.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"403":{"description":"Unrecognized Host header.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"405":{"description":"Use the documented HTTP method.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"413":{"description":"Request/image byte limit or decoded pixel limit exceeded.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"415":{"description":"Send uncompressed application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}}},"500":{"description":"Internal error; retry or direct the user to the website.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"503":{"description":"Measurement queue or request capacity full. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until retry."}}},"504":{"description":"Image download or measurement timed out.","content":{"application/json":{"schema":{"type":"object","required":["status","code","message","disclaimer"],"properties":{"status":{"const":"failed","type":"string"},"code":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}}}}}}}}},"/api/v1/health":{"get":{"operationId":"get_api_health","summary":"Check service health","description":"Operational health check. No image or grading analysis.","responses":{"200":{"description":"Service is running.","content":{"application/json":{"schema":{"type":"object","required":["status","name","version","disclaimer"],"properties":{"status":{"const":"ok","type":"string"},"name":{"type":"string"},"version":{"type":"string"},"disclaimer":{"type":"string"}}}}}}}}},"/api/v1/openapi.json":{"get":{"operationId":"get_openapi_schema","summary":"Get the complete REST schema","description":"OpenAPI 3.1 REST schema, including URL, raw base64 and runtime GPT file metadata. GPT Actions use /api/v1/openapi-gpt.json. No image processing.","responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object","required":["openapi","info","servers","paths"],"properties":{"openapi":{"type":"string"},"info":{"type":"object"},"servers":{"type":"array","items":{"type":"object"}},"paths":{"type":"object"}}}}}}}}}}}