PayPal Billing Subscriptions API

The PayPal Billing Subscriptions API enables businesses to create and manage subscription plans, activate, suspend, cancel, capture, and revise customer subscriptions, and track recurring payments.

OpenAPI Specification

paypal-billing-subscriptions-openapi-original.yml Raw ↑
openapi: 3.0.3
info:
  title: Paypal Subscriptions
  description: You can use billing plans and subscriptions to create subscriptions that process recurring PayPal payments for physical or digital goods, or services. A plan includes pricing and billing cycle information that defines the amount and frequency of charge for a subscription. You can also define a fixed plan, such as a $5 basic plan or a volume- or graduated-based plan with pricing tiers based on the quantity purchased. For more information, see <a href="/docs/subscriptions/">Subscriptions Overview</a>.
  version: '1.6'
  contact: {}
servers:
  - url: https://api-m.sandbox.paypal.com
    description: PayPal Sandbox Environment
  - url: https://api-m.paypal.com
    description: PayPal Live Environment
tags:
  - name: Plans
    description: Use the `/billing/plans` resource to create and manage plans.
  - name: Subscriptions
    description: Use the `/billing/subscriptions` resource to create and manage subscriptions.
externalDocs:
  url: https://developer.paypal.com/docs/api/subscriptions/v1/
paths:
  "/v1/billing/plans":
    post:
      summary: Paypal Create plan
      description: Creates a plan that defines pricing and billing cycle details for subscriptions.
      operationId: plans.create
      responses:
        '200':
          description: A successful request returns the HTTP `200 OK` status code and a JSON response body that shows billing plan details.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/plan"
              examples:
                plan:
                  value:
                    id: P-5ML4271244454362WXNWU5NQ
                    product_id: PROD-XXCD1234QWER65782
                    name: Video Streaming Service Plan
                    description: Video Streaming Service basic plan
                    status: ACTIVE
                    billing_cycles:
                      - frequency:
                          interval_unit: MONTH
                          interval_count: 1
                        tenure_type: TRIAL
                        sequence: 1
                        total_cycles: 2
                        pricing_scheme:
                          fixed_price:
                            value: '3'
                            currency_code: USD
                          version: 1
                          create_time: '2020-05-27T12:13:51Z'
                          update_time: '2020-05-27T12:13:51Z'
                      - frequency:
                          interval_unit: MONTH
                          interval_count: 1
                        tenure_type: TRIAL
                        sequence: 2
                        total_cycles: 3
                        pricing_scheme:
                          fixed_price:
                            currency_code: USD
                            value: '6'
                          version: 1
                          create_time: '2020-05-27T12:13:51Z'
                          update_time: '2020-05-27T12:13:51Z'
                      - frequency:
                          interval_unit: MONTH
                          interval_count: 1
                        tenure_type: REGULAR
                        sequence: 3
                        total_cycles: 12
                        pricing_scheme:
                          fixed_price:
                            currency_code: USD
                            value: '10'
                          version: 1
                          create_time: '2020-05-27T12:13:51Z'
                          update_time: '2020-05-27T12:13:51Z'
                    payment_preferences:
                      auto_bill_outstanding: true
                      setup_fee:
                        value: '10'
                        currency_code: USD
                      setup_fee_failure_action: CONTINUE
                      payment_failure_threshold: 3
                    taxes:
                      percentage: '10'
                      inclusive: false
                    create_time: '2020-05-27T12:13:51Z'
                    update_time: '2020-05-27T12:13:51Z'
                    links:
                      - href: https://api-m.paypal.com/v1/billing/plans/P-5ML4271244454362WXNWU5NQ
                        rel: self
                        method: GET
                      - href: https://api-m.paypal.com/v1/billing/plans/P-5ML4271244454362WXNWU5NQ
                        rel: edit
                        method: PATCH
                      - href: https://api-m.paypal.com/v1/billing/plans/P-5ML4271244454362WXNWU5NQ/deactivate
                        rel: deactivate
                        method: POST
                      - href: https://api-m.paypal.com/v1/billing/plans/P-5ML4271244454362WXNWU5NQ/update-pricing-schemes
                        rel: edit
                        method: POST
        '201':
          description: A successful request returns the HTTP `201 Created` status code and a JSON response body that shows billing plan details.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/plan"
        '400':
          description: Bad Request. Request is not well-formed, syntactically incorrect, or violates schema.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_400"
                  - "$ref": "#/components/schemas/plans.create-400"
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '422':
          description: The requested action could not be performed, semantically incorrect, or failed business validation.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_422"
                  - "$ref": "#/components/schemas/422"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/prefer"
        - "$ref": "#/components/parameters/paypal_request_id"
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/plan_request_POST"
            examples:
              plan_request_post:
                value:
                  product_id: PROD-XXCD1234QWER65782
                  name: Video Streaming Service Plan
                  description: Video Streaming Service basic plan
                  status: ACTIVE
                  billing_cycles:
                    - frequency:
                        interval_unit: MONTH
                        interval_count: 1
                      tenure_type: TRIAL
                      sequence: 1
                      total_cycles: 2
                      pricing_scheme:
                        fixed_price:
                          value: '3'
                          currency_code: USD
                    - frequency:
                        interval_unit: MONTH
                        interval_count: 1
                      tenure_type: TRIAL
                      sequence: 2
                      total_cycles: 3
                      pricing_scheme:
                        fixed_price:
                          value: '6'
                          currency_code: USD
                    - frequency:
                        interval_unit: MONTH
                        interval_count: 1
                      tenure_type: REGULAR
                      sequence: 3
                      total_cycles: 12
                      pricing_scheme:
                        fixed_price:
                          value: '10'
                          currency_code: USD
                  payment_preferences:
                    auto_bill_outstanding: true
                    setup_fee:
                      value: '10'
                      currency_code: USD
                    setup_fee_failure_action: CONTINUE
                    payment_failure_threshold: 3
                  taxes:
                    percentage: '10'
                    inclusive: false
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Plans
    get:
      summary: Paypal List plans
      description: Lists billing plans.
      operationId: plans.list
      responses:
        '200':
          description: A successful request returns the HTTP `200 OK` status code and a JSON response body that lists billing plans.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/plan_collection"
        '400':
          description: Request is not well-formed, syntactically incorrect, or violates schema.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_400"
                  - "$ref": "#/components/schemas/400"
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '404':
          description: The specified resource does not exist.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_404"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/prefer"
        - "$ref": "#/components/parameters/product_id"
        - "$ref": "#/components/parameters/plan_ids"
        - "$ref": "#/components/parameters/page_size"
        - "$ref": "#/components/parameters/page"
        - "$ref": "#/components/parameters/total_required"
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Plans
  "/v1/billing/plans/{id}":
    get:
      summary: Paypal Show plan details
      description: Shows details for a plan, by ID.
      operationId: plans.get
      responses:
        '200':
          description: A successful request returns the HTTP `200 OK` status code and a JSON response body that shows plan details.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/plan"
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '404':
          description: The specified resource does not exist.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_404"
                  - "$ref": "#/components/schemas/404"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/id"
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Plans
    patch:
      summary: Paypal Update plan
      description: Updates a plan with the `CREATED` or `ACTIVE` status. For an `INACTIVE` plan, you can make only status updates.<br/>You can patch these attributes and objects:<table><thead><tr><th>Attribute or object</th><th>Operations</th></tr></thead><tbody><tr><td><code>description</code></td><td>replace</td></tr><tr><td><code>payment_preferences.auto_bill_outstanding</code></td><td>replace</td></tr><tr><td><code>taxes.percentage</code></td><td>replace</td></tr><tr><td><code>payment_preferences.payment_failure_threshold</code></td><td>replace</td></tr><tr><td><code>payment_preferences.setup_fee</code></td><td>replace</td></tr><tr><td><code>payment_preferences.setup_fee_failure_action</code></td><td>replace</td></tr><tr><td><code>name</code></td><td>replace</td></tr></tbody></table>
      operationId: plans.patch
      responses:
        '204':
          description: A successful request returns the HTTP `204 No Content` status code with no JSON response body.
        '400':
          description: Request is not well-formed, syntactically incorrect, or violates schema.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_400"
                  - "$ref": "#/components/schemas/plans.patch-400"
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '404':
          description: The specified resource does not exist.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_404"
                  - "$ref": "#/components/schemas/404"
        '422':
          description: The requested action could not be performed, semantically incorrect, or failed business validation.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_422"
                  - "$ref": "#/components/schemas/plans.patch-422"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/id"
      requestBody:
        "$ref": "#/components/requestBodies/patch_request"
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Plans
  "/v1/billing/plans/{id}/activate":
    post:
      summary: Paypal Activate plan
      description: Activates a plan, by ID.
      operationId: plans.activate
      responses:
        '204':
          description: A successful request returns the HTTP `204 No Content` status code with no JSON response body.
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '404':
          description: The specified resource does not exist.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_404"
                  - "$ref": "#/components/schemas/404"
        '422':
          description: The requested action could not be performed, semantically incorrect, or failed business validation.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_422"
                  - "$ref": "#/components/schemas/plans.activate-422"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/id"
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Plans
  "/v1/billing/plans/{id}/deactivate":
    post:
      summary: Paypal Deactivate plan
      description: Deactivates a plan, by ID.
      operationId: plans.deactivate
      responses:
        '204':
          description: A successful request returns the HTTP `204 No Content` status code with no JSON response body.
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '404':
          description: The specified resource does not exist.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_404"
                  - "$ref": "#/components/schemas/404"
        '422':
          description: The requested action could not be performed, semantically incorrect, or failed business validation.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_422"
                  - "$ref": "#/components/schemas/plans.deactivate-422"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/id"
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Plans
  "/v1/billing/plans/{id}/update-pricing-schemes":
    post:
      summary: Paypal Update pricing
      description: Updates pricing for a plan. For example, you can update a regular billing cycle from $5 per month to $7 per month.
      operationId: plans.update-pricing-schemes
      responses:
        '204':
          description: A successful request returns the HTTP `204 No Content` status code with no JSON response body.
        '400':
          description: Bad Request. Request is not well-formed, syntactically incorrect, or violates schema.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_400"
                  - "$ref": "#/components/schemas/plans.update-pricing-schemes-400"
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '404':
          description: The specified resource does not exist.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_404"
                  - "$ref": "#/components/schemas/404"
        '422':
          description: The requested action could not be performed, semantically incorrect, or failed business validation.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_422"
                  - "$ref": "#/components/schemas/plans.update-pricing-schemes-422"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/id"
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/update_pricing_schemes_list_request"
            examples:
              update_pricing_schemes_list_request:
                value:
                  pricing_schemes:
                    - billing_cycle_sequence: 1
                      pricing_scheme:
                        fixed_price:
                          value: '50'
                          currency_code: USD
                    - billing_cycle_sequence: 2
                      pricing_scheme:
                        fixed_price:
                          value: '100'
                          currency_code: USD
                        pricing_model: VOLUME
                        tiers:
                          - starting_quantity: '1'
                            ending_quantity: '1000'
                            amount:
                              value: '150'
                              currency_code: USD
                          - starting_quantity: '1001'
                            amount:
                              value: '250'
                              currency_code: USD
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Plans
  "/v1/billing/subscriptions":
    post:
      summary: Paypal Create subscription
      description: Creates a subscription.
      operationId: subscriptions.create
      responses:
        '200':
          description: A successful request returns the HTTP `200 OK` status code and a JSON response body that shows subscription details.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/subscription"
              examples:
                subscription:
                  value:
                    id: I-BW452GLLEP1G
                    status: APPROVAL_PENDING
                    status_update_time: '2018-12-10T21:20:49Z'
                    plan_id: P-5ML4271244454362WXNWU5NQ
                    plan_overridden: false
                    start_time: '2018-11-01T00:00:00Z'
                    quantity: '20'
                    shipping_amount:
                      currency_code: USD
                      value: '10.00'
                    subscriber:
                      name:
                        given_name: John
                        surname: Doe
                      email_address: [email protected]
                      payer_id: 2J6QB8YJQSJRJ
                      shipping_address:
                        name:
                          full_name: John Doe
                        address:
                          address_line_1: 2211 N First Street
                          address_line_2: Building 17
                          admin_area_2: San Jose
                          admin_area_1: CA
                          postal_code: '95131'
                          country_code: US
                    create_time: '2018-12-10T21:20:49Z'
                    links:
                      - href: https://www.paypal.com/webapps/billing/subscriptions?ba_token=BA-2M539689T3856352J
                        rel: approve
                        method: GET
                      - href: https://api-m.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G
                        rel: edit
                        method: PATCH
                      - href: https://api-m.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G
                        rel: self
                        method: GET
        '201':
          description: A successful request returns the HTTP `201 Created` status code and a JSON response body that shows subscription details.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/subscription"
              examples:
                subscription:
                  value:
                    id: I-BW452GLLEP1G
                    status: APPROVAL_PENDING
                    status_update_time: '2018-12-10T21:20:49Z'
                    plan_id: P-5ML4271244454362WXNWU5NQ
                    plan_overridden: false
                    start_time: '2018-11-01T00:00:00Z'
                    quantity: '20'
                    shipping_amount:
                      currency_code: USD
                      value: '10.00'
                    subscriber:
                      name:
                        given_name: John
                        surname: Doe
                      email_address: [email protected]
                      payer_id: 2J6QB8YJQSJRJ
                      shipping_address:
                        name:
                          full_name: John Doe
                        address:
                          address_line_1: 2211 N First Street
                          address_line_2: Building 17
                          admin_area_2: San Jose
                          admin_area_1: CA
                          postal_code: '95131'
                          country_code: US
                    create_time: '2018-12-10T21:20:49Z'
                    links:
                      - href: https://www.paypal.com/webapps/billing/subscriptions?ba_token=BA-2M539689T3856352J
                        rel: approve
                        method: GET
                      - href: https://api-m.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G
                        rel: edit
                        method: PATCH
                      - href: https://api-m.paypal.com/v1/billing/subscriptions/I-BW452GLLEP1G
                        rel: self
                        method: GET
        '400':
          description: Bad Request. Request is not well-formed, syntactically incorrect, or violates schema.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_400"
                  - "$ref": "#/components/schemas/subscriptions.create-400"
        '401':
          description: Authentication failed due to missing authorization header, or invalid authentication credentials.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_401"
                  - "$ref": "#/components/schemas/401"
        '403':
          description: Authorization failed due to insufficient permissions.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_403"
                  - "$ref": "#/components/schemas/403"
        '422':
          description: The requested action could not be performed, semantically incorrect, or failed business validation.
          content:
            application/json:
              schema:
                allOf:
                  - "$ref": "#/components/schemas/error_422"
                  - "$ref": "#/components/schemas/subscriptions.create-422"
        '500':
          description: An internal server error has occurred.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error_500"
        default:
          "$ref": "#/components/responses/default"
      parameters:
        - "$ref": "#/components/parameters/prefer"
        - "$ref": "#/components/parameters/paypal_request_id"
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/subscription_request_post"
            examples:
              subscription_request_post:
                value:
                  plan_id: P-5ML4271244454362WXNWU5NQ
                  start_time: '2018-11-01T00:00:00Z'
                  quantity: '20'
                  shipping_amount:
                    currency_code: USD
                    value: '10.00'
                  subscriber:
                    name:
                      given_name: John
                      surname: Doe
                    email_address: [email protected]
                    shipping_address:
                      name:
                        full_name: John Doe
                      address:
                        address_line_1: 2211 N First Street
                        address_line_2: Building 17
                        admin_area_2: San Jose
                        admin_area_1: CA
                        postal_code: '95131'
                        country_code: US
                  application_context:
                    brand_name: walmart
                    locale: en-US
                    shipping_preference: SET_PROVIDED_ADDRESS
                    user_action: SUBSCRIBE_NOW
                    payment_method:
                      payer_selected: PAYPAL
                      payee_preferred: IMMEDIATE_PAYMENT_REQUIRED
                    return_url: https://example.com/returnUrl
                    cancel_url: https://example.com/cancelUrl
      security:
        - Oauth2:
            - https://uri.paypal.com/services/subscriptions
      tags:
        - Subscriptions
  "/v1/billing/subscriptions/{id}":
    get:
      summary: Paypal Show subscription details
      description: Shows details for a subscription, by ID.
      operationId: subscriptions.get
      responses:
        '200':
          description: A successful request returns the HTTP `200 OK` status code and a JSON response body that shows subscription details.
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/subscr

# --- truncated at 32 KB (196 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/paypal/refs/heads/main/openapi/paypal-billing-subscriptions-openapi-original.yml