> ## Documentation Index
> Fetch the complete documentation index at: https://devs.tapipay.la/llms.txt
> Use this file to discover all available pages before exploring further.

# Eliminar un medio de pago del usuario

> Elimina un medio de pago del usuario. Antes da de baja las adhesiones que lo usaban. Si era el predeterminado, el más reciente de los medios que le quedan al usuario pasa a serlo; si no le queda ninguno, el usuario queda sin medio predeterminado. Las órdenes de pago que ya se crearon con este medio siguen su curso. Reintentar es seguro: si el medio ya se había eliminado, la respuesta es 404.



## OpenAPI

````yaml /api-reference/openapi.yaml delete /payment-methods/{externalPaymentMethodId}
openapi: 3.0.0
info:
  title: TapiPay API
  version: 1.0.0
  description: >
    API pública de la plataforma de cobranzas TapiPay.  Ofrece un contrato
    limpio y desacoplado del modelo interno de la plataforma, permitiendo a los
    clientes crear y gestionar cobros (deudas puntuales,  suscripciones
    recurrentes, links de pago, productos y contactos)  sin conocer detalles
    internos de Company, Modalities o GenerationData.
  contact:
    name: TapiPay Team
    url: https://www.tapipay.com
  license:
    name: Proprietary
servers:
  - url: https://tapipay-facade.homo.tapila.cloud
    description: Homologación
security:
  - apiKeyAuth: []
    tapiAuth: []
paths:
  /payment-methods/{externalPaymentMethodId}:
    delete:
      tags:
        - Payment methods
      summary: Eliminar un medio de pago del usuario
      description: >-
        Elimina un medio de pago del usuario. Antes da de baja las adhesiones
        que lo usaban. Si era el predeterminado, el más reciente de los medios
        que le quedan al usuario pasa a serlo; si no le queda ninguno, el
        usuario queda sin medio predeterminado. Las órdenes de pago que ya se
        crearon con este medio siguen su curso. Reintentar es seguro: si el
        medio ya se había eliminado, la respuesta es 404.
      operationId: deletePaymentMethod
      parameters:
        - $ref: '#/components/parameters/CompanyCode'
        - name: externalPaymentMethodId
          in: path
          required: true
          schema:
            type: string
          description: El medio a eliminar, tal como lo devuelve GET /payment-methods.
        - name: externalClientId
          in: query
          required: true
          schema:
            type: string
          description: >-
            Tu identificador del usuario final: exactamente el mismo del
            enrolamiento. No admite los caracteres `'`, `"`, `\`, `;`.
      responses:
        '200':
          description: Medio eliminado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/PaymentMethodDeletion'
                  requestId:
                    type: string
        '400':
          description: >-
            INVALID_REQUEST si falta externalClientId o trae caracteres no
            admitidos; BAD_REQUEST si tu cliente tiene varias companies y no
            enviaste companyCode.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: >-
            RESOURCE_NOT_FOUND: el medio no existe, no es de ese usuario o ya se
            eliminó.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: RESOLUTION_ERROR si el companyCode no pertenece a tu cliente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: >-
            INTERNAL_ERROR: no se pudo completar la eliminación. Reintenta con
            la misma petición: las bajas que ya se hicieron no se repiten.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  parameters:
    CompanyCode:
      name: companyCode
      in: query
      required: false
      schema:
        type: string
        example: MX-S-04937
      description: >-
        Solo si tu cliente tiene varias companies: indica en cuál operas. En
        POST y PATCH también se puede enviar en el cuerpo (el cuerpo tiene
        prioridad). Si tu cliente tiene varias companies y no lo envías, 400
        BAD_REQUEST; si no es una company de tu cliente, 422 RESOLUTION_ERROR
        (403 en /v2/debts/orders).
  schemas:
    PaymentMethodDeletion:
      type: object
      description: Resultado de eliminar un medio de pago.
      required:
        - externalPaymentMethodId
        - wasDefault
        - newDefaultExternalPaymentMethodId
        - deactivatedAdhesions
        - deactivatedAdhesionsCount
      properties:
        externalPaymentMethodId:
          type: string
          description: El medio que se eliminó.
          example: 3f9c1a7e-8d2b-4c55-9e1a-2b7d6f0c4a11
        wasDefault:
          type: boolean
          description: Si el medio eliminado era el predeterminado del usuario.
        newDefaultExternalPaymentMethodId:
          type: string
          nullable: true
          description: >-
            Si se eliminó el predeterminado, el medio que pasó a serlo: el más
            reciente de los que le quedan al usuario. Viene en null si no se
            eliminó el predeterminado o si al usuario no le queda ningún medio.
          example: b7e4a0c2-9f13-4e6d-8a25-71c3d9e0b4f8
        deactivatedAdhesions:
          type: array
          description: >-
            Adhesiones que se dieron de baja porque usaban este medio. No se
            pasan solas a otro medio: para volver a adherir, llama a POST
            /adhesions.
          items:
            type: object
            required:
              - productId
            properties:
              productId:
                type: string
                nullable: true
                example: prd_7
        deactivatedAdhesionsCount:
          type: integer
          description: Cantidad de adhesiones dadas de baja.
    Error:
      type: object
      required:
        - error
        - requestId
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              enum:
                - INVALID_REQUEST
                - BAD_REQUEST
                - RESOURCE_NOT_FOUND
                - RESOURCE_CONFLICT
                - RESOLUTION_ERROR
                - BUSINESS_RULE_VIOLATION
                - RATE_LIMITED
                - INTERNAL_ERROR
                - PARTIAL_UPDATE
                - NO_ACTIVE_PAYMENT_METHOD
                - COMPANY_WITHOUT_PRODUCT_MODALITY
                - CONTACT_NOT_FOUND
                - COMPANY_WITHOUT_DEBT_ID_MODALITY
                - PAYMENT_METHODS_NOT_ENABLED
                - ORDER_NOT_CREATED
                - PAYMENT_METHOD_NOT_AVAILABLE
              description: >-
                Código de error estándar. BAD_REQUEST se usa cuando tu cliente
                tiene varias companies y no se envía `companyCode`.
                NO_ACTIVE_PAYMENT_METHOD y COMPANY_WITHOUT_PRODUCT_MODALITY
                aparecen en POST /adhesions (el primero también en POST
                /v2/debts/orders). CONTACT_NOT_FOUND,
                COMPANY_WITHOUT_DEBT_ID_MODALITY, PAYMENT_METHODS_NOT_ENABLED,
                ORDER_NOT_CREATED y PAYMENT_METHOD_NOT_AVAILABLE solo aparecen
                en POST /v2/debts/orders. PARTIAL_UPDATE solo aparece en el 207
                de PATCH /subscriptions/{id}: la suscripción se actualizó, pero
                alguna de sus deudas no. Los 401 y 403 los emite el API Gateway
                y no usan este envelope (ver GatewayError). Excepción: en
                /v2/debts/orders, RESOLUTION_ERROR responde 403 con este
                envelope.
            message:
              type: string
              description: >-
                Mensaje legible del error. Es informativo: no lo parsees, usa
                `code` y `details[].field`.
            details:
              type: array
              description: >-
                Array de detalles adicionales (validaciones por campo, etc.). Un
                JSON malformado devuelve `[{ "field": "body", "issue": "Invalid
                JSON syntax" }]`.
              items:
                type: object
                properties:
                  field:
                    type: string
                    description: Campo que falló la validación
                  issue:
                    type: string
                    description: Descripción del problema
                  index:
                    type: integer
                    description: >-
                      Solo en el modo lote de POST /v2/debts. Posición del item
                      en `debts`.
                  externalRequestId:
                    type: string
                    description: >-
                      Solo en el modo lote de POST /v2/debts. externalRequestId
                      del item.
        requestId:
          type: string
          pattern: ^req_[a-zA-Z0-9]+$
          description: ID único del request para trazabilidad
    GatewayError:
      type: object
      description: >-
        Respuesta de error emitida por el API Gateway, antes de llegar al
        servicio. No lleva el envelope `error` ni `requestId`. Casos: token
        faltante o inválido en `x-authorization-token` devuelve `401 {"message":
        "Unauthorized"}`; `x-api-key` faltante o inválida devuelve `403
        {"message": "Forbidden"}`; token válido sin permiso sobre el recurso
        devuelve `403 {"Message": "User is not authorized to access this
        resource with an explicit deny"}`. Ojo al tipar: en este último caso el
        campo viene con mayúscula (`Message`), no `message`.
      properties:
        message:
          type: string
          example: Unauthorized
        Message:
          type: string
          description: Solo en el 403 de explicit deny (con mayúscula).
          example: User is not authorized to access this resource with an explicit deny
  responses:
    Unauthorized:
      description: >-
        No autenticado. Lo emite el API Gateway cuando falta o es inválido el
        token en `x-authorization-token`. Body `{"message": "Unauthorized"}`,
        sin envelope `error` ni `requestId`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/GatewayError'
          example:
            message: Unauthorized
    Forbidden:
      description: >-
        Prohibido. Lo emite el API Gateway, sin envelope `error` ni `requestId`.
        Si falta o es inválida la `x-api-key`, el body es `{"message":
        "Forbidden"}`. Si el token es válido pero no tiene permiso sobre el
        recurso, el body es `{"Message": "User is not authorized to access this
        resource with an explicit deny"}` (campo con mayúscula).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/GatewayError'
          examples:
            apiKey:
              summary: x-api-key faltante o inválida
              value:
                message: Forbidden
            explicitDeny:
              summary: Token sin permiso sobre el recurso
              value:
                Message: >-
                  User is not authorized to access this resource with an
                  explicit deny
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >
        API key del API Gateway de Tapi. Requerida en todas las operaciones.
        Distinta por ambiente (desarrollo, homologación, producción).
    tapiAuth:
      type: apiKey
      in: header
      name: x-authorization-token
      description: >
        Token TAPI JWT. Requerido en todas las operaciones. Se envía sin prefijo
        "Bearer". Ej: x-authorization-token: eyJhbGci...

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.