Softlemon API Documentation
  • Merchant API
  • Partner API
  • Guides
Information
Transactions
    Initiate TransactionpostCapture TransactionpostRefund TransactionpostTransaction StatusgetVoid Transactionpost
Payment Instruments
    List payment instrumentsgetRevoke a payment instrumentdelete
Payment Sessions
    Create a payment sessionpostGet a payment sessiongetList available payment methodsget
Card Verification
    Initiate Card Verificationpost
Webhook Management
    Get webhook configurationgetCreate or update the webhook endpointputDelete the webhook endpointdeleteRotate the webhook signing secretpostSend a test pingpostList webhook eventsgetGet a webhook eventgetReplay a webhook eventpost
API Operations
    Get API Key Informationget
Schemas
Softlemon Merchant API
Softlemon Merchant API

Card Verification


Initiate Card Verification

POST
https://api.sandbox.softlemons.com
/api/v1/3ds/verify

Initiate a 3D Secure card verification process before a payment request.

Identifier. The verification is identified by public_id (format tds_...). Store it and send it as card_verification_data.id when initiating the transaction. The numeric id in the response is deprecated: it remains for existing integrations and will be removed from the response on a date announced in advance. Numeric ids already stored stay accepted on input. Treat every id as an opaque string and ignore response fields you do not recognise; new fields are added over time.

Frictionless flow: If the issuer does not require a challenge, the response returns immediately with the outcome in status (see the status table below) and a message that spells it out. Use the returned public_id in card_verification_data.id when initiating the transaction.

Challenge flow: The response includes a challenge_url. Redirect the cardholder there. After they complete the bank challenge, they are redirected to your auth_url with ?card_verification_id={public_id}&status={outcome} query parameters. card_verification_id is the tds_... public id, a string; pass it through as card_verification_data.id when initiating the transaction.

Outcomes. full_auth: the issuer authenticated the cardholder, proceed. attempt: the issuer could not fully authenticate but returned an attempt proof, proceed (the proof is forwarded with the payment). unavailable: the card is not enrolled or authentication could not be performed, no authentication data exists; you may still create the payment, it is processed without 3DS and may be soft-declined where SCA is required. failed: the issuer refused, do not proceed, run a new verification (an immediate failure is returned as HTTP 400 ERR_3DS_FAILED). challenge_pending: only while the cardholder is with the issuer. A payment that references a failed or unfinished verification is refused with HTTP 422.

Authenticate with a merchant API key or a partner API key plus merchant_id for the merchant being acted on behalf of (same rules as the transaction endpoint).

Initiate Card Verification › Request Body

amount
​number · required

Transaction amount in major units, for example 12.50 for EUR 12.50.

currency
​string · required

Transaction currency (3-letter ISO code).

​object · required

Card details object.

auth_url
​string · required

Your return URL. After the cardholder completes the 3DS challenge, they are redirected here with ?card_verification_id={public_id}&status={full_auth|attempt|unavailable|failed} query parameters. card_verification_id is the tds_... public id (a string); pass it through as card_verification_data.id on the payment.

merchant_id
​integer

Required when authenticating with a partner API key. The id of a merchant linked to that partner. Omit when using a merchant API key.

​object

Browser data for 3DS 2.0 when the merchant uses the PXP acquirer. Optional for other acquirers.

Initiate Card Verification › Responses

oneOf
Exactly one variant must match.

Decision Table

VariantMatching Criteria
type = object
type = object
type = object
type = object
Properties for Variant 1:
Frictionless, fully authenticated.
success
​boolean
message
​string
code
​string
​object
POST/api/v1/3ds/verify
curl https://api.sandbox.softlemons.com/api/v1/3ds/verify \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "amount": 12.5, "currency": "EUR", "card": { "number": "4200000000000091", "exp_month": "12", "exp_year": "2030", "name": "John Doe", "cvv": "123" }, "auth_url": "https://yoursite.com/checkout/3ds-complete", "merchant_id": 123, "browser_data": { "accept_header": "text/html,application/xhtml+xml", "color_depth": 24, "java_enabled": false, "java_script_enabled": true, "language": "en-US", "screen_height": 1080, "screen_width": 1920, "time_zone_offset_in_minutes": -60, "user_agent": "Mozilla/5.0...", "ip_address": "203.0.113.1" } }'
Example Request Body
{ "amount": 12.5, "currency": "EUR", "card": { "number": "4200000000000091", "exp_month": "12", "exp_year": "2030", "name": "John Doe", "cvv": "123" }, "auth_url": "https://yoursite.com/checkout/3ds-complete", "merchant_id": 123, "browser_data": { "accept_header": "text/html,application/xhtml+xml", "color_depth": 24, "java_enabled": false, "java_script_enabled": true, "language": "en-US", "screen_height": 1080, "screen_width": 1920, "time_zone_offset_in_minutes": -60, "user_agent": "Mozilla/5.0...", "ip_address": "203.0.113.1" } }
json
Example Responses
{ "success": true, "message": "3DS authentication completed (frictionless)", "code": "", "data": { "id": 166, "public_id": "tds_01k2h4x9m3n5p7q9r1s3t5v7w9", "amount": 1250, "currency": "EUR", "version": "2.2.0", "eci": "05", "cavv": "AAABA0UREQAAAAAAAAAAAAAAAAA=", "xid": null, "ds_trans_id": "6b66be83-f692-405c-9079-92f7182af5e5", "status": "full_auth", "auth_type": "frictionless", "challenge_url": null, "post_url": null, "html": null, "created_at": "2025-06-12 09:47:15", "updated_at": "2025-06-12 09:47:15" } }
json
application/json

Payment SessionsWebhook Management