Skip to main content

Reviews API Reference Guide

The Reviews API allows you to retrieve information about a credit card scan performed by your end user. You can obtain redacted versions of the scan images for review purposes, which we refer to as "blackout images.”

Getting Started

The Reviews API provides access to the blackout images. There are two flavors. The first flavor is a typical shared secret based access. Provide a token and a scanID to obtain a pre-signed S3 URL pointing to the redacted image of the card stored on our server.

The second flavor of the Reviews API introduces two types of users: admins and reviewers. Admins receive a token that allows them to create a temporary token for reviewers to access a specific scan image. Reviewers are given time-limited access to the blackout images but are not allowed to create temporary tokens. Additionally, reviewer tokens provide access to a temporary URL. After one hour, the URL pointing to the blackout image will expire.

The following diagram summarizes a possible workflow.

To authenticate requests to the Reviews API, a dedicated key is required. To identify an admin, include the X-REVIEWER-ID request header, which contains a unique identifier for each admin. We will provide identifiers upon request. To identify a reviewer, include the authorization: Bearer temporary_token request header, where the temporary_token is generated by your admins to identify a reviewer.

Endpoints

Get end-user redacted card image presigned url

No OpenAPI specification URL provided

info

Notice that the imageSrc attribute of the response is always defined as the redacted image doesn't need to exist on S3 to create the presigned URL. An additional attribute status provides that missing information. status takes 3 values: READY, UPLOADING or FILENOTFOUND.

import requests

url = "https://api.dyneti.com/reviews/image"

headers = {
"X-REVIEW-ID": "your_access_token"
}

params = {
"scanId": "your_scan_id",
"ExpiresIn": 3600
}

response = requests.get(url, headers=headers, params=params)

if response.status_code == 200:
data = response.json()
image_url = data["imageSrc"]
print("Image URL:", image_url)
else:
print("Error:", response.text)

Get end-user redacted card image in jpeg format

No OpenAPI specification URL provided

info

If only a tight crop image is available, it will be returned with status code 200 even if the tight query parameter is not set to true.

import requests

scanid = 'your_scan_id'
headers = {'X-REVIEW-ID': 'your_access_token'}
api_url = f'https://api.dyneti.com/reviews/image/{scanid}.jpg'
# To request a tight crop instead, add the tight query parameter:
# api_url += '?tight=true'
response = requests.get(api_url, headers=headers)

if response.status_code == 200:
with open(f'{scanid}.jpg', 'wb') as f:
f.write(response.content)

Posting feedback

No OpenAPI specification URL provided

Accepted shortcodes are:

shortcodecomment
approvedApproved - card looks ok
denied_bin_mismatchCard bin or last 4 mismatch with image
denied_screen_displayImage is being displayed on a screen
denied_fake_cardImage is a fake/modified physical card
denied_digitally_alteredImage is digitally altered
denied_branding_mismatchCard branding/network is different from the bin checker
denied_fraud_vectorKnown fraud vector
denied_otherOther (deny)
no_action_no_image_availableNo action taken because no image is available
no_action_poor_image_qualityNo action taken due to poor image quality
no_action_bad_redaction_middle_digitsNo action taken due to middle digits' visibility
no_action_bad_redaction_cvvNo action taken because the cvv is readable.
no_action_bad_redaction_full_nameNo action taken because the full cardholder name is visible
no_action_bad_redaction_faceNo action taken because an identifiable human face is visible
no_action_bad_redaction_last_fourNo action taken because the last four digits are not readable
no_action_otherNo action taken for another reason

Notice that you can add any additional content in the key annotationInfo

import requests

url = "https://api.dyneti.com/reviews/feedback"
payload = {
"scanId": "123456",
"annotationShortCode": "approved",
"annotationInfo": {"key": "value"}
}
headers = {
"Content-Type": "application/json",
"X-REVIEW-ID": "<admin-access-token>"
}
requests.post(url, json=payload, headers=headers)

Reviewers management

Generate Reviewer Authorization Token

GET https://api.dyneti.com/reviews/authorize

This endpoint generates an authorization token (JWT) that grants permission to access blackout images. It is used by admin only and requires the X-REVIEWER-ID header with appropriate credential.

Query Parameters

NameTypeDescription
reviewer*How you want your reviewer to be identified.

Headers

NameTypeDescription
X-REVIEWER-ID*StringToken provided to the admin

JSON Object containing your reviewer's temporary token

{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXZpZXJfaWQiOiJ0ZXN0aWQiLCJyZXZpZXdfYWNjb3VudCI6ImFkbWluIiwidXNlcl9pZCI6MTIzNDU2Nzg5MCwiYXV0aG9yaXplZEZvcl9pZCI6IjEyMzQ1Njc4OTAiLCJpYXQiOjE2MzI4OTc5NjIsImV4cCI6MTYzMzQ5Nzk2Mn0.6tkJLtV1IvpDjF3a7m5GMsINNrz0Wi6GCB3Mz3HjPE0"
}

Fields description:

token - the temporary token associated with a reviewer.

curl -X GET "https://api.dyneti.com/reviews/authorize?reviewer=review1" \
-H "X-REVIEW-ID: example_0123456789u0ALMrmV2RXa7YZMdZjAOoTxjM3EbVnRz6SQ5TFzY1"

Response:

{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXZpZXJfaWQiOiJ0ZXN0aWQiLCJyZXZpZXdfYWNjb3VudCI6ImFkbWluIiwidXNlcl9pZCI6MTIzNDU2Nzg5MCwiYXV0aG9yaXplZEZvcl9pZCI6IjEyMzQ1Njc4OTAiLCJpYXQiOjE2MzI4OTc5NjIsImV4cCI6MTYzMzQ5Nzk2Mn0.6tkJLtV1IvpDjF3a7m5GMsINNrz0Wi6GCB3Mz3HjPE0"
}

Get blackout image using a JWT token

Get Blackout Image temporary URL

POST https://api.dyneti.com/reviews/b

This endpoint provides information about a credit card scan performed by your end-user.

Query Parameters

NameTypeDescription
scanId*Stringscan id obtained from scan information.

Headers

NameTypeDescription
authorization*StringFormatted as "Bearer: token". This token is obtained using this endpoint
curl -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXZpZXJfaWQiOiJ0ZXN0aWQiLCJyZXZpZXdfYWNjb3VudCI6ImFkbWluIiwidXNlcl9pZCI6MTIzNDU2Nzg5MCwiYXV0aG9yaXplZEZvcl9pZCI6IjEyMzQ1Njc4OTAiLCJpYXQiOjE2MzI4OTc5NjIsImV4cCI6MTYzMzQ5Nzk2Mn0.6tkJLtV1IvpDjF3a7m5GMsINNrz0Wi6GCB3Mz3HjPE0" \
-X GET "https://api.dyneti.com/reviews/b?scanId=80881ebe-0100-496f-8cc7-353026bd95b8"

Response

{
imageSrc: "https://...../80881ebe-0100-496f-8cc7-353026bd95b8.jpg"
}