---
updatedAt: 2026-09-02T15:10:31.000Z
agentTools:
  projectIndex: https://docs.nmi.com/llms.txt
---

# Plan Management

> This documentation is intended for existing Classic API integrations. For new integrations, use the [Payment Component](../docs/payment-component) with the [REST API](../reference/create-sale-v5). If you're migrating from the Classic API, follow the [Classic API migration playbook](../docs/payment-migration-playbook).
<details>
<summary>Methodology</summary>

**Steps:**
1. The customer sends their payment information to the merchant's web site.
2. The merchant web site posts the payment data to the Payment Gateway.
3. The Payment Gateway responds immediately with the results of the transactions.
4. The merchant web site displays the appropriate message to the customer.

The communication method used to send messages to the Payment Gateway's server is the standard HTTP protocol over an SSL connection.

In the Payment API method, the communications with the cardholder (Steps 1 and 4) are developed completely by the merchant and therefore are not defined by the Payment Gateway. Step 1 should simply collect the payment data from the cardholder and Step 4 should display the appropriate transaction receipt or declined message.

In Step 2, transaction details should be delivered to the Payment Gateway using the POST method with the appropriate variables defined below posted along with the request.

In Step 3, the transaction responses are returned in the body of the HTTP response in a query string name/value format delimited by ampersands. For example: `variable1=value1&variable2=value2&variable3=value3`

### Customer Vault
The Customer Vault was designed specifically for businesses of any size to address concerns about handling customer payment information. Visa and MasterCard have instituted the Payment Card Industry (PCI) Data Security to protect cardholder data, wherever it resides, ensuring that members, merchants, and service providers maintain the highest information security standards.

These associations have also deemed that merchants will be held liable for any breach of cardholder data. This has become a major concern for merchants who handle credit card or electronic check payments. The Customer Vault is designed for these merchants who desire to avoid the tremendous costs and resources involved in becoming PCI compliant under these circumstances.

The Customer Vault does this by allowing merchants to transmit their payment information through a Secure Sockets Layer (SSL) connection for storage in our Level 1 PCI certified data facility. Once the customer record has been securely transmitted to the Customer Vault, the merchant can then initiate transactions remotely without having to access cardholder information directly. This process is accomplished without the merchant storing the customer's payment information in their local database or payment application.
</details>

<details>
<summary>Response Code Table</summary>

| Code  | Description                                                        |
|:------|:-------------------------------------------------------------------|
| 100   | Transaction was approved.                                          |
| 200   | Transaction was declined by processor.                             |
| 201   | Do not honor.                                                      |
| 202   | Insufficient funds.                                                |
| 203   | Over limit.                                                        |
| 204   | Transaction not allowed.                                           |
| 220   | Incorrect payment information.                                     |
| 221   | No such card issuer.                                               |
| 222   | No card number on file with issuer.                                |
| 223   | Expired card.                                                      |
| 224   | Invalid expiration date.                                           |
| 225   | Invalid card security code.                                        |
| 226   | Invalid PIN.                                                       |
| 240   | Call issuer for further information.                               |
| 250   | Pick up card.                                                      |
| 251   | Lost card.                                                         |
| 252   | Stolen card.                                                       |
| 253   | Fraudulent card.                                                   |
| 260   | Declined with further instructions available. (See response text)  |
| 261   | Declined-Stop all recurring payments.                              |
| 262   | Declined-Stop this recurring program.                              |
| 263   | Declined-Update cardholder data available.                         |
| 264   | Declined-Retry in a few days.                                      |
| 300   | Transaction was rejected by gateway.                               |
| 400   | Transaction error returned by processor.                           |
| 410   | Invalid merchant configuration.                                    |
| 411   | Merchant account is inactive.                                      |
| 420   | Communication error.                                               |
| 421   | Communication error with issuer.                                   |
| 430   | Duplicate transaction at processor.                                |
| 440   | Processor format error.                                            |
| 441   | Invalid transaction information.                                   |
| 460   | Processor feature not available.                                   |
| 461   | Unsupported card type.                                             |

</details>

<div class="alert alert-blue">
  ### **Never Use Real API Keys**

Use Sandbox keys with the Try It feature. Do not enter production API keys when testing.

</div>

# OpenAPI definition

```json
{
  "openapi": "3.1.0",
  "info": {
    "version": "1.0.0",
    "title": "Payments",
    "x-logo": {
      "url": "https://www.nmi.com/app/themes/nmi/images/NMI_Logo_Primary.webp"
    }
  },
  "servers": [
    {
      "url": "https://sandbox.nmi.com/api"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Plans",
      "description": "Recurring payment plan management for creating and editing billing plans"
    }
  ],
  "externalDocs": {
    "url": "https://www.postman.com/nmi-integration-support/workspace/nmi-public-documentation/request/5480015-f4b0ec7b-bd84-4094-98c2-67c0b6508a7f",
    "description": "Public Documentation (Postman)"
  },
  "paths": {
    "/transact.php": {
      "post": {
        "tags": [
          "Plans"
        ],
        "summary": "Plan Management",
        "description": "<details>\n<summary>Methodology</summary>\n\n**Steps:**\n1. The customer sends their payment information to the merchant's web site.\n2. The merchant web site posts the payment data to the Payment Gateway.\n3. The Payment Gateway responds immediately with the results of the transactions.\n4. The merchant web site displays the appropriate message to the customer.\n\nThe communication method used to send messages to the Payment Gateway's server is the standard HTTP protocol over an SSL connection.\n\nIn the Payment API method, the communications with the cardholder (Steps 1 and 4) are developed completely by the merchant and therefore are not defined by the Payment Gateway. Step 1 should simply collect the payment data from the cardholder and Step 4 should display the appropriate transaction receipt or declined message.\n\nIn Step 2, transaction details should be delivered to the Payment Gateway using the POST method with the appropriate variables defined below posted along with the request.\n\nIn Step 3, the transaction responses are returned in the body of the HTTP response in a query string name/value format delimited by ampersands. For example: `variable1=value1&variable2=value2&variable3=value3`\n\n### Customer Vault\nThe Customer Vault was designed specifically for businesses of any size to address concerns about handling customer payment information. Visa and MasterCard have instituted the Payment Card Industry (PCI) Data Security to protect cardholder data, wherever it resides, ensuring that members, merchants, and service providers maintain the highest information security standards.\n\nThese associations have also deemed that merchants will be held liable for any breach of cardholder data. This has become a major concern for merchants who handle credit card or electronic check payments. The Customer Vault is designed for these merchants who desire to avoid the tremendous costs and resources involved in becoming PCI compliant under these circumstances.\n\nThe Customer Vault does this by allowing merchants to transmit their payment information through a Secure Sockets Layer (SSL) connection for storage in our Level 1 PCI certified data facility. Once the customer record has been securely transmitted to the Customer Vault, the merchant can then initiate transactions remotely without having to access cardholder information directly. This process is accomplished without the merchant storing the customer's payment information in their local database or payment application.\n</details>\n\n<details>\n<summary>Response Code Table</summary>\n\n| Code  | Description                                                        |\n|:------|:-------------------------------------------------------------------|\n| 100   | Transaction was approved.                                          |\n| 200   | Transaction was declined by processor.                             |\n| 201   | Do not honor.                                                      |\n| 202   | Insufficient funds.                                                |\n| 203   | Over limit.                                                        |\n| 204   | Transaction not allowed.                                           |\n| 220   | Incorrect payment information.                                     |\n| 221   | No such card issuer.                                               |\n| 222   | No card number on file with issuer.                                |\n| 223   | Expired card.                                                      |\n| 224   | Invalid expiration date.                                           |\n| 225   | Invalid card security code.                                        |\n| 226   | Invalid PIN.                                                       |\n| 240   | Call issuer for further information.                               |\n| 250   | Pick up card.                                                      |\n| 251   | Lost card.                                                         |\n| 252   | Stolen card.                                                       |\n| 253   | Fraudulent card.                                                   |\n| 260   | Declined with further instructions available. (See response text)  |\n| 261   | Declined-Stop all recurring payments.                              |\n| 262   | Declined-Stop this recurring program.                              |\n| 263   | Declined-Update cardholder data available.                         |\n| 264   | Declined-Retry in a few days.                                      |\n| 300   | Transaction was rejected by gateway.                               |\n| 400   | Transaction error returned by processor.                           |\n| 410   | Invalid merchant configuration.                                    |\n| 411   | Merchant account is inactive.                                      |\n| 420   | Communication error.                                               |\n| 421   | Communication error with issuer.                                   |\n| 430   | Duplicate transaction at processor.                                |\n| 440   | Processor format error.                                            |\n| 441   | Invalid transaction information.                                   |\n| 460   | Processor feature not available.                                   |\n| 461   | Unsupported card type.                                             |\n\n</details>",
        "operationId": "managePlans",
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/AddPlanWithNDayChargeRequest"
                  },
                  {
                    "$ref": "#/components/schemas/AddPlanWithMonthlyChargeRequest"
                  },
                  {
                    "$ref": "#/components/schemas/EditPlanWithNDayChargeRequest"
                  },
                  {
                    "$ref": "#/components/schemas/EditPlanWithMonthlyChargeRequest"
                  }
                ]
              },
              "examples": {
                "Add Plan Daily Charge Request": {
                  "$ref": "#/components/examples/AddPlanNDayCharge"
                },
                "Add Plan With Monthly Charge Request": {
                  "$ref": "#/components/examples/AddPlanWithMonthlyCharge"
                },
                "Edit Plan Daily Charge Request": {
                  "$ref": "#/components/examples/EditPlanWithNDayCharge"
                },
                "Edit Plan With Monthly Charge Request": {
                  "$ref": "#/components/examples/EditPlanWithMonthlyCharge"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Plan operation completed successfully",
            "content": {
              "application/x-www-form-urlencoded": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                },
                "examples": {
                  "Plan Created": {
                    "$ref": "#/components/examples/PlanCreated"
                  },
                  "Plan Updated": {
                    "$ref": "#/components/examples/PlanUpdated"
                  },
                  "Declined Request": {
                    "$ref": "#/components/examples/DeclinedResponse"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "SecurityKey": {
        "type": "string",
        "description": "API Security Key assigned to a merchant account. New keys can be generated from the merchant control panel in Settings > Security Keys"
      },
      "RecurringFields": {
        "type": "object",
        "properties": {
          "plan_payments": {
            "type": "integer",
            "description": "The number of payments before the recurring plan is complete.\n\nNote: Use '0' for until canceled"
          },
          "plan_amount": {
            "type": "number",
            "description": "The plan amount to be charged each billing cycle.\n\nFormat: `x.xx`"
          }
        }
      },
      "RecurringFieldsWithPlanId": {
        "allOf": [
          {
            "type": "object",
            "properties": {
              "plan_id": {
                "type": "string",
                "description": "Create a subscription tied to a Plan ID if the sale/auth transaction is successful."
              }
            }
          },
          {
            "$ref": "#/components/schemas/RecurringFields"
          }
        ]
      },
      "RecurringDailyFields": {
        "type": "object",
        "properties": {
          "day_frequency": {
            "type": "integer",
            "description": "How often, in days, to charge the customer. Cannot be set with 'month_frequency' or 'day_of_month'."
          }
        }
      },
      "AddPlanWithNDayChargeRequest": {
        "title": "Add Daily Plan",
        "allOf": [
          {
            "required": [
              "recurring",
              "plan_payments",
              "plan_amount",
              "plan_name",
              "plan_id",
              "day_frequency",
              "security_key"
            ],
            "type": "object",
            "properties": {
              "security_key": {
                "$ref": "#/components/schemas/SecurityKey"
              },
              "recurring": {
                "type": "string",
                "enum": [
                  "add_plan"
                ],
                "description": "Add a recurring plan that subscriptions can be added to in the future."
              },
              "plan_name": {
                "type": "string",
                "description": "The display name of the plan."
              },
              "start_date": {
                "type": "string",
                "format": "date",
                "description": "The first day that the customer will be charged.\n\nFormat: `YYYYMMDD`\n\n",
                "x-group-key": "Recurring"
              }
            }
          },
          {
            "$ref": "#/components/schemas/RecurringFieldsWithPlanId"
          },
          {
            "$ref": "#/components/schemas/RecurringDailyFields"
          }
        ]
      },
      "RecurringMonthlyFields": {
        "type": "object",
        "properties": {
          "month_frequency": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "description": "How often, in months, to charge the customer. Cannot be set with 'day_frequency'. Must be set with 'day_of_month'."
          },
          "day_of_month": {
            "type": "integer",
            "minimum": 1,
            "maximum": 31,
            "description": "The day that the customer will be charged. Cannot be set with 'day_frequency'. Must be set with 'month_frequency'. For months without 29, 30, or 31 days, the charge will be on the last day."
          }
        }
      },
      "AddPlanWithMonthlyChargeRequest": {
        "title": "Add Monthly Plan",
        "allOf": [
          {
            "required": [
              "recurring",
              "plan_payments",
              "plan_amount",
              "plan_name",
              "plan_id",
              "month_frequency",
              "day_of_month",
              "security_key"
            ],
            "type": "object",
            "properties": {
              "security_key": {
                "$ref": "#/components/schemas/SecurityKey"
              },
              "recurring": {
                "type": "string",
                "enum": [
                  "add_plan"
                ],
                "description": "Add a recurring plan that subscriptions can be added to in the future."
              },
              "plan_name": {
                "type": "string",
                "description": "The display name of the plan."
              },
              "start_date": {
                "type": "string",
                "format": "date",
                "description": "The first day that the customer will be charged.\n\nFormat: `YYYYMMDD`",
                "x-group-key": "Recurring"
              }
            }
          },
          {
            "$ref": "#/components/schemas/RecurringFieldsWithPlanId"
          },
          {
            "$ref": "#/components/schemas/RecurringMonthlyFields"
          }
        ]
      },
      "EditPlanWithNDayChargeRequest": {
        "title": "Edit Daily Plan",
        "allOf": [
          {
            "required": [
              "recurring",
              "current_plan_id",
              "day_frequency",
              "security_key"
            ],
            "type": "object",
            "properties": {
              "security_key": {
                "$ref": "#/components/schemas/SecurityKey"
              },
              "recurring": {
                "type": "string",
                "enum": [
                  "edit_plan"
                ],
                "description": "Edit an existing recurring plan.\n\nValue: 'edit_plan' - Be careful when editing an existing plan, as all customers signed up for this plan will have their billing changed based on your edits."
              },
              "current_plan_id": {
                "type": "string",
                "description": "Only relevant for editing an existing plan, the value will be the 'plan_id' that will be edited in this request."
              },
              "plan_name": {
                "type": "string",
                "description": "The display name of the plan."
              }
            }
          },
          {
            "$ref": "#/components/schemas/RecurringFieldsWithPlanId"
          },
          {
            "$ref": "#/components/schemas/RecurringDailyFields"
          }
        ]
      },
      "EditPlanWithMonthlyChargeRequest": {
        "title": "Edit Monthly Plan",
        "allOf": [
          {
            "required": [
              "recurring",
              "current_plan_id",
              "month_frequency",
              "day_of_month",
              "security_key"
            ],
            "type": "object",
            "properties": {
              "security_key": {
                "$ref": "#/components/schemas/SecurityKey"
              },
              "recurring": {
                "type": "string",
                "enum": [
                  "edit_plan"
                ],
                "description": "Edit an existing recurring plan.\n\nValue: 'edit_plan' - Be careful when editing an existing plan, as all customers signed up for this plan will have their billing changed based on your edits."
              },
              "current_plan_id": {
                "type": "string",
                "description": "Only relevant for editing an existing plan, the value will be the 'plan_id' that will be edited in this request."
              },
              "plan_name": {
                "type": "string",
                "description": "The display name of the plan."
              }
            }
          },
          {
            "$ref": "#/components/schemas/RecurringFieldsWithPlanId"
          },
          {
            "$ref": "#/components/schemas/RecurringMonthlyFields"
          }
        ]
      },
      "Response": {
        "type": "object",
        "title": "Response",
        "properties": {
          "response": {
            "type": "string",
            "enum": [
              "1",
              "2",
              "3"
            ],
            "description": "Status code for the operation. (1) - success, (2) - failed, (3) system error"
          },
          "responsetext": {
            "type": "string",
            "description": "Textual description of the operation's result."
          },
          "authcode": {
            "type": "string",
            "description": "Authorization code for the operation."
          },
          "amount_authorized": {
            "type": "string",
            "description": "(Conditional) This will optionally come back when requesting partial payment. Authorization amount."
          },
          "transactionid": {
            "type": "string",
            "description": "(Conditional - Payment) Payment gateway transaction id."
          },
          "invoice_id": {
            "type": "string",
            "description": "(Conditional - Invoice) Identifier for the invoice."
          },
          "avsresponse": {
            "type": "string",
            "description": "Address Verification Service response code."
          },
          "cvvresponse": {
            "type": "string",
            "description": "Card Verification Value response."
          },
          "orderid": {
            "type": "string",
            "description": "Identifier for an order related to this invoice."
          },
          "type": {
            "type": "string",
            "enum": [
              "sale",
              "auth",
              "validate",
              "credit",
              "offline",
              "capture",
              "void",
              "refund",
              "complete_partial_payment",
              "add_invoice",
              "update_invoice",
              "send_invoice",
              "close_invoice",
              "add_plan",
              "edit_plan",
              "add_subscription",
              ""
            ],
            "description": "Type of operation that this response is for."
          },
          "partial_payment_id": {
            "type": "string",
            "description": "(Conditional) This will optionally come back when requesting partial payment. A numeric identifier which is used when submitting subsequent transactions."
          },
          "partial_payment_balance": {
            "type": "string",
            "description": "(Conditional) This will optionally come back when requesting partial payment. The payment's remaining balance."
          },
          "platform_id": {
            "type": "string",
            "description": "Platform ID associated with the transaction."
          },
          "response_code": {
            "type": "string",
            "description": "Another status or result code for the operation. See [Response Code Table](#section/Appendixes/Payment-API-Response-Codes)"
          },
          "subscription_id": {
            "type": "string",
            "description": "(Conditional - Subscription) The subscription ID that was created"
          },
          "emv_auth_response_data": {
            "type": "string",
            "description": "(Conditional) This will optionally come back when any chip card data is provided on the authorization. This data needs to be sent back to the SDK after an authorization."
          },
          "payment_terms": {
            "type": "string",
            "description": "(Conditional - Invoice) The terms of payment for the invoice."
          },
          "customer_vault_id": {
            "type": "string",
            "description": "(Conditional - Customer Vault) The original customer_vault_id passed in the transaction request or the resulting customer_vault_id created on an approved transaction.\n\nNote: Only returned when the \"Customer Vault\" service is active."
          },
          "kount_score": {
            "type": "string",
            "description": "The Kount \"Omniscore\" indicating the level of risk on a given transaction. The higher the score, the lower the risk.\n\nNote: Only returned when the \"Kount\" service is active."
          }
        }
      }
    },
    "examples": {
      "AddPlanNDayCharge": {
        "summary": "Add Plan With Daily Charge",
        "description": "Add a recurring plan that subscriptions can be added to in the future.",
        "value": {
          "recurring": "add_plan",
          "plan_payments": 0,
          "plan_amount": 230.22,
          "plan_name": "Plan 1 Name",
          "plan_id": "223",
          "day_frequency": 31,
          "security_key": "6457Thfj624V5r7WUwc5v6a68Zsd6YEm"
        }
      },
      "AddPlanWithMonthlyCharge": {
        "summary": "Add Plan With Monthly Charge",
        "description": "Add a recurring plan that subscriptions can be added to in the future.",
        "value": {
          "recurring": "add_plan",
          "plan_payments": 2,
          "plan_amount": 323.33,
          "plan_name": "Plan 2 Name",
          "plan_id": "223",
          "month_frequency": 2,
          "day_of_month": 4,
          "security_key": "6457Thfj624V5r7WUwc5v6a68Zsd6YEm"
        }
      },
      "EditPlanWithNDayCharge": {
        "summary": "Edit an existing recurring plan With Daily Charge",
        "description": "Edit an existing recurring plan.",
        "value": {
          "recurring": "edit_plan",
          "current_plan_id": "21",
          "plan_payments": 2,
          "plan_amount": 323.33,
          "plan_name": "Plan 2 Name",
          "plan_id": "21",
          "month_frequency": 2,
          "day_of_month": 4,
          "security_key": "6457Thfj624V5r7WUwc5v6a68Zsd6YEm"
        }
      },
      "EditPlanWithMonthlyCharge": {
        "summary": "Edit an existing recurring plan With Daily Charge option",
        "description": "Edit an existing recurring plan.",
        "value": {
          "recurring": "edit_plan",
          "current_plan_id": "21",
          "plan_payments": 0,
          "plan_amount": 230.22,
          "plan_name": "Plan 1 Name",
          "plan_id": "21",
          "day_frequency": 31,
          "security_key": "6457Thfj624V5r7WUwc5v6a68Zsd6YEm"
        }
      },
      "PlanCreated": {
        "summary": "Plan Created",
        "description": "Plan has been created successfully",
        "value": {
          "response": "1",
          "responsetext": "Plan Added",
          "authcode": "",
          "transactionid": "",
          "avsresponse": "",
          "cvvresponse": "",
          "orderid": "",
          "type": "",
          "response_code": "100"
        }
      },
      "PlanUpdated": {
        "summary": "Plan Updated",
        "description": "Plan has been updated successfully",
        "value": {
          "response": "1",
          "responsetext": "Plan Edit Successful",
          "authcode": "",
          "transactionid": "",
          "avsresponse": "",
          "cvvresponse": "",
          "orderid": "",
          "type": "",
          "response_code": "100"
        }
      },
      "DeclinedResponse": {
        "summary": "Failed to Create Plan",
        "description": "Failed to create a new plan",
        "value": {
          "response": "3",
          "responsetext": "There is already a plan using the SKU you have specified. REFID:1203610329",
          "authcode": "",
          "transactionid": "",
          "avsresponse": "",
          "cvvresponse": "",
          "orderid": "",
          "type": "",
          "response_code": "100"
        }
      }
    }
  }
}
```