Bulk Recovery

📓 Summary

This page provides an end-to-end guide for integrating with Sticky.io's Bulk Recovery APIs. Bulk endpoints allow merchants to submit multiple transactions in a single API request, optimizing throughput and reducing integration complexity.

🔍Overview

Sticky.io’s Bulk Recovery APIs extend the functionality of the standard single-transaction endpoints by enabling bulk operations. These endpoints support up to 1000 transactions per request, ensuring high efficiency for platforms that process large volumes of declines.

📦 Available Bulk Endpoints

NameEndpointMethodDescription
Bulk RecoveryPOSTSubmits multiple failed transactions for recovery.
Bulk CancelPOSTCancels multiple recovery sessions.
Bulk RefundPOSTIssues refunds for multiple recovered transactions.

✅ Prerequisites

Before integrating the Recover endpoint, ensure the following:

  • Obtain an API Key: Your API key will be provided by sticky.io during onboarding. This key is required to authenticate all requests to the Recover API. The key can also be found under the developer section.
  • Gateway Profile Connected: At least one payment gateway must be connected through the Sticky.io platform.
  • Dunning Profile Configured: At least one dunning profile must be set up to define a retry strategy for failed payments.
  • Webhook URLs Configured (Optional but Recommended): To receive updates throughout the recovery lifecycle, configure webhook endpoints via Developer > Webhooks in the UI.

🚦Bulk Recovery API

Request Field Description

ElementTypeRequiredDescription
idStringYesGateway transaction ID of the original declined transaction used for payment recovery.
externalIdStringAn optional merchant-defined reference ID used to identify the transaction externally.
initiatedByStringYesIndicates who initiated the transaction. Use CIT for customer-initiated and MIT for merchant-initiated transactions.
isRecurringBooleanYesBoolean indicating whether the transaction is part of a recurring billing cycle.
dunningProfileIdStringIdentifier for the dunning (retry) strategy applied during payment recovery.
recoveryTransactionAmountIntegerOverrides the original failed transaction amount, in the smallest currency unit (e.g., 1000 for $10.00).
recoveryTransactionCurrencyStringOverrides the currency of the original failed transaction. Must use ISO 4217 format (e.g., USD).
amountIntegerYesDeclined transaction amount in the smallest currency unit (e.g., 1000 for $10.00).
currencyStringYesCurrency of the declined transaction, represented in ISO 4217 format (e.g., USD).
declineReasonStringYesCode or reason provided by the payment provider indicating the failure (e.g., "Do Not Honor", "Insufficient Funds").
binStringBank Identification Number (BIN) linked to the payment method; minimum 6 digits.
responseCodeStringGateway response code explaining the decline reason.
avsResultCodeStringAddress Verification System (AVS) result for the declined transaction.
cvvResultCodeStringCard Verification Value (CVV) result for the declined transaction.
cavvResultCodeStringCardholder Authentication Verification Value (CAVV) result for 3DS-secured transactions.
processorNameStringName of the payment processor that handled the declined transaction (e.g., NMI, Stripe).
processorDeclineCodeStringNumeric ISO 8583 decline code returned by the payment processor (e.g., 51 = Insufficient Funds, 05 = Do Not Honor).
networkAdviceCodeStringIssuer-provided code advising whether a declined transaction should be retried, delayed, or avoided (used by Mastercard).
timeStampUTCStringTimestamp of the original declined transaction in UTC.
mitReferenceTransactionIdStringIdentifier linking the recovery attempt to a prior successful charge (used for MIT authorization improvements).
mitReferenceSettlementDateStringSettlement date of the referenced transaction, required if mitReferenceTransactionId is provided.
lastSuccessfulBillingDateStringDate of the last successful recurring transaction for this customer.
previousBillingCountIntegerNumber of previous successful billings for this subscription or customer.
billingFrequencyStringFrequency of recurring billing (e.g., Weekly, Monthly, Annually).
customer.customerIdStringUnique identifier for the customer in the merchant or gateway system.
customer.firstNameStringCustomer’s first name.
customer.lastNameStringCustomer’s last name.
customer.emailStringCustomer’s email address.
customer.phoneStringCustomer’s phone number.
gateway.paymentProfileIdStringRequired. Identifier for the payment gateway profile to be used for recovery attempts.
gateway.isDefaultBooleanIndicates if this gateway profile is set as the default.
paymentMethod.isDefaultBooleanMarks this payment method as the customer’s default option in the vault.
paymentMethod.billingAddress1StringPrimary address line, including street and building number.
paymentMethod.billingAddress2StringAdditional address details, such as apartment or suite number.
paymentMethod.billingCityStringCity for the billing address.
paymentMethod.billingStateStringState or province for the billing address.
paymentMethod.billingZipStringPostal or ZIP code for the billing address.
paymentMethod.billingCountryStringCountry for the billing address (ISO 3166-1 alpha-2 code).
paymentMethod.token.typeStringConditionally Required**Specifies the type of tokenization used (e.g., CARD, GATEWAY, STICKY, APPLE, GOOGLE).
paymentMethod.token.idStringConditionally Required**Unique identifier for the tokenized payment method.
paymentMethod.token.idStringToken ID used to charge the card.
paymentMethod.card.cardHolderNameStringConditionally Required**Name of the cardholder as it appears on the card.
paymentMethod.card.cardNumberStringConditionally Required**Full card number (PAN) to be used for the recovery attempt.
paymentMethod.card.cvvStringCard Verification Value is used for authentication.
paymentMethod.card.expMonthStringConditionally Required**Expiration month of the card (MM format).
paymentMethod.card.expYearStringConditionally Required**Expiration year of the card (YYYY format).

Bulk Request Format

{
  "transactions": [
    {
      "id": "trans_001",
      "externalId": "order_001",
      "initiatedBy": "MIT",
      "isRecurring": true,
      "dunningProfileId": "101",
      "recoveryTransactionAmount": 4200,
      "recoveryTransactionCurrency": "USD",
      "amount": 4200,
      "currency": "USD",
      "declineReason": "Do Not Honor",
      "bin": "411111",
      "responseCode": "05",
      "avsResultCode": "N",
      "cvvResultCode": "N",
      "cavvResultCode": "",
      "processorName": "NMI",
      "processorDeclineCode": "",
      "networkAdviceCode": "04",
      "timeStampUTC": "2025-09-20T14:25:10Z",
      "mitReferenceTransactionId": "abc123",
      "mitReferenceSettlementDate": "2025-09-10",
      "lastSuccessfulBillingDate": "2025-08-10",
      "previousBillingCount": 3,
      "billingFrequency": "Monthly",
      "customer": {
        "customerId": "cust_001",
        "firstName": "Jane",
        "lastName": "Doe",
        "email": "[email protected]",
        "phone": "5551234567"
      },
      "gateway": {
        "paymentProfileId": "profile_123",
        "isDefault": true
      },
      "paymentMethod": {
        "isDefault": true,
        "billingAddress1": "123 Main St",
        "billingAddress2": "Apt 4",
        "billingCity": "Los Angeles",
        "billingState": "CA",
        "billingZip": "90210",
        "billingCountry": "US",
        "token": {
          "type": "GATEWAY",
          "id": "toknen_XXXX"
        }
      }
    },
    {
      "id": "trans_02",
      "externalId": "order_002",
      "initiatedBy": "MIT",
      "isRecurring": true,
      "dunningProfileId": "101",
      "recoveryTransactionAmount": 100,
      "recoveryTransactionCurrency": "USD",
      "amount": 100,
      "currency": "USD",
      "declineReason": "Insufficent Funds",
      "bin": "411111",
      "responseCode": "05",
      "avsResultCode": "N",
      "cvvResultCode": "N",
      "cavvResultCode": "",
      "processorName": "NMI",
      "processorDeclineCode": "",
      "networkAdviceCode": "04",
      "timeStampUTC": "2025-09-20T14:25:10Z",
      "mitReferenceTransactionId": "abc123",
      "mitReferenceSettlementDate": "2025-09-10",
      "lastSuccessfulBillingDate": "2025-08-10",
      "previousBillingCount": 3,
      "billingFrequency": "Monthly",
      "customer": {
        "customerId": "cust_002",
        "firstName": "John",
        "lastName": "Doe",
        "email": "[email protected]",
        "phone": "5551234567"
      },
      "gateway": {
        "paymentProfileId": "profile_123",
        "isDefault": true
      },
      "paymentMethod": {
        "isDefault": true,
        "billingAddress1": "123 Main St",
        "billingAddress2": "Apt 4",
        "billingCity": "Los Angeles",
        "billingState": "CA",
        "billingZip": "90210",
        "billingCountry": "US",
        "token": {
          "type": "GATEWAY",
          "id": "toknen_XXXX"
        }
      }
    }
  ]
}

Bulk Cancel API

Use the Bulk Cancel Recovery endpoint to stop up to 1000 recovery sessions in a single request. This is functionally identical to the single cancel endpoint (Cancel Recovery) but is designed for bulk operations.

If you need to halt recovery attempts for an active session, such as when a customer updates their payment method or cancels their subscription, submit a list of stickyTransactionId values along with a desired status (CANCELED, DEFERRED, or RESOLVED).

Request Field Description

ElementTypeRequiredDescription
stickyTransactionIdYesUnique identifier assigned to the recovery transaction session. Required when canceling an active recovery session.
statusYesThe status of the transactions, valid options are CANCELED, DEFERRED, and RESOLVED.

Bulk Request Format

{
  "transactions": [
    {
      "stickyTransactionId": "STICKY_TXN_123456",
      "status": "CANCELED",
    },
    {
      "stickyTransactionId": "STICKY_TXN_654321",
      "status": "RESOLVED",
    }
  ]
}

💸Bulk Refund API

Use the Bulk Refund endpoint to issue refunds for up to 1000 recovered transactions in a single request. This endpoint is functionally identical to the single refund endpoint (Refund) but supports bulk operations.

To process refunds in bulk, submit a list of stickyTransactionId values, each with a refund amount and an optional refundReason.

Request Field Description

ElementTypeRequiredDescription
stickyTransactionIdYesUnique identifier assigned to the recovery transaction session. Required when performing a refund.
amountYesThe amount that is going to be captured. Amount should be the same or lower than the one captured previously.
authorizationIdConditionally RequiredUnique identifier for the transaction authorization.
refundReasonReason for processing the refund.
refundDescriptionAdditional details about the refund reason.

Bulk Request Format

{
  "transactions": [
    {
      "stickyTransactionId": "STICKY_TXN_654321",
      "amount": 1000,
      "authorizationId": "AUTH_ABC123",
      "refundReason": "Product defective",
      "refundDescription": "Customer returned product within 7 days"
    },
    {
      "stickyTransactionId": "STICKY_TXN_765432",
      "amount": 5000,
      "authorizationId": "AUTH_DEF456",
      "refundReason": "Partial refund after price dispute",
      "refundDescription": "Adjusted based on coupon pricing"
    }
  ]
}

📡 Bulk Request Summary Webhook

A webhook is triggered after a bulk request (Recovery, Cancel, or Refund) is fully processed. This webhook provides a summary of the submission results, showing how many records were accepted and how many were rejected. Processing may take a few minutes, depending on load and validation.

This webhook does not return per-transaction details. To access full results, including errors, use the Bulk Request Details API

{
  "clientAppKey": "7bebb0d5-ea45-44aa-9122-fb522eb12314",
  "type": "bulk.submission.status",
  "time": "2025-08-27T14:42:00Z",
  "data": {
    "requestId": "Request_00123",
    "requestType": "REFUND",
    "totalSubmitted": 1000,
    "totalAccepted": 950,
    "totalRejected": 50
  }
}

ℹ️ For retries, encryption, and other technical details, refer to the Webhooks page. This central page covers all system webhooks, including headers, retry behavior, signing secrets, and example error handling strategies.


📄 GET Bulk Request Details

📘 API Reference: Bulk Request Details

Use this API to retrieve the full outcome of any bulk submission. This includes both accepted and rejected transactions, along with their stickyTransactionId, gatewayTransactionId, and rejection reasons (if applicable).

This endpoint is typically used after receiving the Bulk Submission Webhook, using the provided requestId.