Midtrans Subscription API

Recurring / subscription billing.

OpenAPI Specification

midtrans-subscription-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Midtrans Payment Card Tokenization Subscription API
  description: 'A representative OpenAPI description of the Midtrans payment platform, an Indonesian payment gateway (part of the GoTo Group). It covers Snap (hosted checkout), the Core API (charge and transaction lifecycle), card and GoPay tokenization, Payment Link, recurring Subscriptions, and Iris disbursement / payouts.


    Hosts vary by product. The default servers below are the Core API / Payment Link / Subscription hosts (api.midtrans.com and api.sandbox.midtrans.com). Snap runs on app.midtrans.com and Iris runs on app.midtrans.com/iris; those paths declare their own path-level `servers` override so the full URL is always unambiguous.


    Authentication is HTTP Basic: your Server Key is the username and the password is empty (`Authorization: Basic base64(SERVER_KEY:)`). The two card tokenization endpoints instead use the public Client Key passed as a query parameter, and Iris uses its own creator / approver API key over HTTP Basic.


    This document was authored by API Evangelist from Midtrans'' public documentation and official Postman collection; request / response bodies are modeled representatively rather than exhaustively.'
  version: '1.0'
  contact:
    name: Midtrans
    url: https://midtrans.com
  license:
    name: Proprietary
    url: https://midtrans.com
servers:
- url: https://api.midtrans.com
  description: Core API / Payment Link / Subscription - Production
- url: https://api.sandbox.midtrans.com
  description: Core API / Payment Link / Subscription - Sandbox
security:
- serverKeyAuth: []
tags:
- name: Subscription
  description: Recurring / subscription billing.
paths:
  /v1/subscriptions:
    post:
      operationId: createSubscription
      tags:
      - Subscription
      summary: Create a subscription
      description: Creates a recurring subscription against a saved card or GoPay token, with an amount, currency, payment_type, token, and a schedule (interval, interval_unit, start_time, max_interval).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionRequest'
      responses:
        '201':
          description: The created subscription.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/subscriptions/{subscription_id}:
    parameters:
    - $ref: '#/components/parameters/SubscriptionId'
    get:
      operationId: getSubscription
      tags:
      - Subscription
      summary: Get a subscription
      description: Retrieves a subscription by its ID.
      responses:
        '200':
          description: The subscription.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateSubscription
      tags:
      - Subscription
      summary: Update a subscription
      description: Updates the amount, schedule, or token of an existing subscription.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionRequest'
      responses:
        '200':
          description: The updated subscription.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /v1/subscriptions/{subscription_id}/enable:
    parameters:
    - $ref: '#/components/parameters/SubscriptionId'
    post:
      operationId: enableSubscription
      tags:
      - Subscription
      summary: Enable a subscription
      description: Re-enables a previously disabled subscription.
      responses:
        '200':
          description: Enable confirmation.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/subscriptions/{subscription_id}/disable:
    parameters:
    - $ref: '#/components/parameters/SubscriptionId'
    post:
      operationId: disableSubscription
      tags:
      - Subscription
      summary: Disable a subscription
      description: Pauses a subscription so no further charges are made until it is re-enabled.
      responses:
        '200':
          description: Disable confirmation.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/subscriptions/{subscription_id}/cancel:
    parameters:
    - $ref: '#/components/parameters/SubscriptionId'
    post:
      operationId: cancelSubscription
      tags:
      - Subscription
      summary: Cancel a subscription
      description: Permanently cancels a subscription.
      responses:
        '200':
          description: Cancel confirmation.
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    SubscriptionSchedule:
      type: object
      properties:
        interval:
          type: integer
        interval_unit:
          type: string
          enum:
          - day
          - week
          - month
        max_interval:
          type: integer
        start_time:
          type: string
    SubscriptionRequest:
      type: object
      required:
      - name
      - amount
      - currency
      - payment_type
      - token
      - schedule
      properties:
        name:
          type: string
        amount:
          type: string
        currency:
          type: string
          enum:
          - IDR
        payment_type:
          type: string
          enum:
          - credit_card
          - gopay
        token:
          type: string
          description: Saved card token or GoPay token.
        schedule:
          $ref: '#/components/schemas/SubscriptionSchedule'
        metadata:
          type: object
          additionalProperties: true
        customer_details:
          $ref: '#/components/schemas/CustomerDetails'
    Subscription:
      allOf:
      - $ref: '#/components/schemas/SubscriptionRequest'
      - type: object
        properties:
          id:
            type: string
          status:
            type: string
            enum:
            - active
            - inactive
    CustomerDetails:
      type: object
      properties:
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
        phone:
          type: string
    Error:
      type: object
      properties:
        status_code:
          type: string
        status_message:
          type: string
        id:
          type: string
  responses:
    Unauthorized:
      description: Missing or invalid credentials.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    SubscriptionId:
      name: subscription_id
      in: path
      required: true
      description: The subscription identifier.
      schema:
        type: string
  securitySchemes:
    serverKeyAuth:
      type: http
      scheme: basic
      description: 'HTTP Basic authentication. Your Server Key is the username and the password is empty, so the header is `Authorization: Basic base64(SERVER_KEY:)`. Iris disbursement uses the same HTTP Basic scheme but with its own creator / approver API key.'