openapi: 3.1.0
info:
version: '6'
x-publicVersion: true
title: Adyen Account acceptDispute voidPendingRefund API
description: "This API is used for the classic integration. If you are just starting your implementation, refer to our [new integration guide](https://docs.adyen.com/marketplaces-and-platforms) instead.\n\nThe Account API provides endpoints for managing account-related entities on your platform. These related entities include account holders, accounts, bank accounts, shareholders, and verification-related documents. The management operations include actions such as creation, retrieval, updating, and deletion of them.\n\nFor more information, refer to our [documentation](https://docs.adyen.com/marketplaces-and-platforms/classic).\n## Authentication\nYour Adyen contact will provide your API credential and an API key. To connect to the API, add an `X-API-Key` header with the API key as the value, for example:\n\n ```\ncurl\n-H \"Content-Type: application/json\" \\\n-H \"X-API-Key: YOUR_API_KEY\" \\\n...\n```\n\nAlternatively, you can use the username and password to connect to the API using basic authentication. For example:\n\n```\ncurl\n-U \"ws@MarketPlace.YOUR_PLATFORM_ACCOUNT\":\"YOUR_WS_PASSWORD\" \\\n-H \"Content-Type: application/json\" \\\n...\n```\nWhen going live, you need to generate new web service user credentials to access the [live endpoints](https://docs.adyen.com/development-resources/live-endpoints).\n\n## Versioning\nThe Account API supports [versioning](https://docs.adyen.com/development-resources/versioning) using a version suffix in the endpoint URL. This suffix has the following format: \"vXX\", where XX is the version number.\n\nFor example:\n```\nhttps://cal-test.adyen.com/cal/services/Account/v6/createAccountHolder\n```"
x-timestamp: '2023-05-30T15:27:20Z'
termsOfService: https://www.adyen.com/legal/terms-and-conditions
contact:
name: Adyen Developer Experience team
url: https://github.com/Adyen/adyen-openapi
servers:
- url: https://cal-test.adyen.com/cal/services/Account/v6
tags:
- name: voidPendingRefund
paths:
/voidPendingRefund:
post:
tags:
- voidPendingRefund
summary: Adyen Cancel an In-person Refund
description: 'This endpoint allows you to cancel an unreferenced refund request before it has been completed.
In your call, you can refer to the original refund request either by using the `tenderReference`, or the `pspReference`. We recommend implementing based on the `tenderReference`, as this is generated for both offline and online transactions.
For more information, refer to [Cancel an unreferenced refund](https://docs.adyen.com/point-of-sale/refund-payment/cancel-unreferenced).'
x-addedInVersion: '25'
operationId: post-voidPendingRefund
x-sortIndex: 7
x-methodName: voidPendingRefund
security:
- BasicAuth: []
- ApiKeyAuth: []
requestBody:
content:
application/json:
examples:
voidpendingrefund-pspreference:
$ref: '#/components/examples/post-voidPendingRefund-voidpendingrefund-pspreference'
voidpendingrefund-tenderreference:
$ref: '#/components/examples/post-voidPendingRefund-voidpendingrefund-tenderreference'
schema:
$ref: '#/components/schemas/VoidPendingRefundRequest'
responses:
'200':
content:
application/json:
examples:
voidpendingrefund-pspreference:
$ref: '#/components/examples/post-voidPendingRefund-voidpendingrefund-pspreference-200'
voidpendingrefund-tenderreference:
$ref: '#/components/examples/post-voidPendingRefund-voidpendingrefund-tenderreference-200'
schema:
$ref: '#/components/schemas/ModificationResult'
description: OK - the request has succeeded.
'400':
content:
application/json:
examples:
generic:
$ref: '#/components/examples/generic-400'
schema:
$ref: '#/components/schemas/ServiceError'
description: Bad Request - a problem reading or understanding the request.
'401':
content:
application/json:
examples:
generic:
$ref: '#/components/examples/generic-401'
schema:
$ref: '#/components/schemas/ServiceError'
description: Unauthorized - authentication required.
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceError'
examples:
post-voidPendingRefund403Example:
summary: Default post-voidPendingRefund 403 response
x-microcks-default: true
value:
additionalData: {}
errorCode: CODE123
errorType: standard
message: example_value
pspReference: REF-001
status: 500
description: Forbidden - insufficient permissions to process the request.
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceError'
examples:
post-voidPendingRefund422Example:
summary: Default post-voidPendingRefund 422 response
x-microcks-default: true
value:
additionalData: {}
errorCode: CODE123
errorType: standard
message: example_value
pspReference: REF-001
status: 500
description: Unprocessable Entity - a request validation error.
'500':
content:
application/json:
examples:
generic:
$ref: '#/components/examples/generic-500'
schema:
$ref: '#/components/schemas/ServiceError'
description: Internal Server Error - the server could not process the request.
x-microcks-operation:
delay: 0
dispatcher: FALLBACK
components:
examples:
generic-401:
summary: Response code 401. Unauthorized.
value:
status: 401
errorCode: '000'
message: HTTP Status Response - Unauthorized
errorType: security
post-voidPendingRefund-voidpendingrefund-pspreference:
summary: Cancel a POS refund request with PSP reference before it has been completed
value:
merchantAccount: YOUR_MERCHANT_ACCOUNT
originalReference: '9914748988390044'
generic-400:
summary: Response code 400. Bad request.
value:
status: 400
errorCode: '702'
message: 'Unexpected input: ", expected: }'
errorType: validation
post-voidPendingRefund-voidpendingrefund-pspreference-200:
summary: Example response for request 'voidpendingrefund-pspreference'
value:
pspReference: 861617892360062F
response: '[voidPendingRefund-received]'
post-voidPendingRefund-voidpendingrefund-tenderreference:
summary: Cancels a POS refund request with tender reference before it has been completed
value:
merchantAccount: YOUR_MERCHANT_ACCOUNT
tenderReference: 5Iw8001176969533005
uniqueTerminalId: VX820-123456789
post-voidPendingRefund-voidpendingrefund-tenderreference-200:
summary: Example response for request 'voidpendingrefund-tenderreference'
value:
pspReference: 881617892360409G
generic-500:
summary: Response code 500. Internal server error.
value:
status: 500
errorCode: '905'
message: Payment details are not supported
errorType: configuration
pspReference: '8516091485743033'
schemas:
AdditionalDataRiskStandalone:
properties:
PayPal.CountryCode:
description: Shopper's country of residence in the form of ISO standard 3166 2-character country codes.
type: string
PayPal.EmailId:
description: Shopper's email.
type: string
PayPal.FirstName:
description: Shopper's first name.
type: string
PayPal.LastName:
description: Shopper's last name.
type: string
PayPal.PayerId:
description: 'Unique PayPal Customer Account identification number. Character length and limitations: 13 single-byte alphanumeric characters.'
type: string
PayPal.Phone:
description: Shopper's phone number.
type: string
PayPal.ProtectionEligibility:
description: 'Allowed values:
* **Eligible** — Merchant is protected by PayPal''s Seller Protection Policy for Unauthorized Payments and Item Not Received.
* **PartiallyEligible** — Merchant is protected by PayPal''s Seller Protection Policy for Item Not Received.
* **Ineligible** — Merchant is not protected under the Seller Protection Policy.'
type: string
PayPal.TransactionId:
description: Unique transaction ID of the payment.
type: string
avsResultRaw:
description: 'Raw AVS result received from the acquirer, where available. Example: D'
type: string
bin:
description: The Bank Identification Number of a credit card, which is the first six digits of a card number. Required for [tokenized card request](https://docs.adyen.com/risk-management/standalone-risk#tokenised-pan-request).
type: string
cvcResultRaw:
description: 'Raw CVC result received from the acquirer, where available. Example: 1'
type: string
riskToken:
description: Unique identifier or token for the shopper's card details.
type: string
threeDAuthenticated:
description: 'A Boolean value indicating whether 3DS authentication was completed on this payment. Example: true'
type: string
threeDOffered:
description: 'A Boolean value indicating whether 3DS was offered for this payment. Example: true'
type: string
tokenDataType:
description: 'Required for PayPal payments only. The only supported value is: **paypal**.'
type: string
type: object
AdditionalDataLodging:
properties:
lodging.checkInDate:
description: 'The arrival date.
* Date format: **yyyyMmDd**. For example, for 2023 April 22, **20230422**.'
type: string
lodging.checkOutDate:
description: 'The departure date.
* Date format: **yyyyMmDd**. For example, for 2023 April 22, **20230422**.'
type: string
lodging.customerServiceTollFreeNumber:
description: 'The toll-free phone number for the lodging.
* Format: numeric
* Max length: 17 characters.
* For US and CA numbers must be 10 characters in length
* Must not start with a space
* Must not contain any special characters such as + or -
*Must not be all zeros.'
type: string
lodging.fireSafetyActIndicator:
description: 'Identifies that the facility complies with the Hotel and Motel Fire Safety Act of 1990. Must be ''Y'' or ''N''.
* Format: alphabetic
* Max length: 1 character'
type: string
lodging.folioCashAdvances:
description: 'The folio cash advances, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: numeric
* Max length: 12 characters'
type: string
lodging.folioNumber:
description: 'The card acceptor’s internal invoice or billing ID reference number.
* Max length: 25 characters.
* Must not start with a space
*Must not be all zeros.'
type: string
lodging.foodBeverageCharges:
description: 'Any charges for food and beverages associated with the booking, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: numeric
* Max length: 12 characters'
type: string
lodging.noShowIndicator:
description: "Indicates if the customer didn't check in for their booking.\n Possible values: \n* **Y**: the customer didn't check in \n* **N**: the customer checked in"
type: string
lodging.prepaidExpenses:
description: 'The prepaid expenses for the booking.
* Format: numeric
* Max length: 12 characters'
type: string
lodging.propertyPhoneNumber:
description: 'The lodging property location''s phone number.
* Format: numeric.
* Min length: 10 characters
* Max length: 17 characters
* For US and CA numbers must be 10 characters in length
* Must not start with a space
* Must not contain any special characters such as + or -
*Must not be all zeros.'
type: string
lodging.room1.numberOfNights:
description: 'The total number of nights the room is booked for.
* Format: numeric
* Must be a number between 0 and 99
* Max length: 4 characters'
type: string
lodging.room1.rate:
description: 'The rate for the room, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: numeric
* Max length: 12 characters
* Must not be a negative number'
type: string
lodging.totalRoomTax:
description: 'The total room tax amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: numeric
* Max length: 12 characters
* Must not be a negative number'
type: string
lodging.totalTax:
description: 'The total tax amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: numeric
* Max length: 12 characters
* Must not be a negative number'
type: string
travelEntertainmentAuthData.duration:
description: 'The number of nights. This should be included in the auth message.
* Format: numeric
* Max length: 4 characters'
type: string
travelEntertainmentAuthData.market:
description: 'Indicates what market-specific dataset will be submitted. Must be ''H'' for Hotel. This should be included in the auth message.
* Format: alphanumeric
* Max length: 1 character'
type: string
type: object
AdditionalDataCarRental:
properties:
carRental.checkOutDate:
description: 'The pick-up date.
* Date format: `yyyyMMdd`'
type: string
carRental.customerServiceTollFreeNumber:
description: 'The customer service phone number of the car rental company.
* Format: Alphanumeric
* maxLength: 17
* For US and CA numbers must be 10 characters in length
* Must not start with a space
* Must not contain any special characters such as + or -
*Must not be all zeros.'
type: string
carRental.daysRented:
description: 'Number of days for which the car is being rented.
* Format: Numeric
* maxLength: 4
* Must not be all spaces'
type: string
carRental.fuelCharges:
description: 'Any fuel charges associated with the rental, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: Numeric
* maxLength: 12'
type: string
carRental.insuranceCharges:
description: 'Any insurance charges associated with the rental, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: Numeric
* maxLength: 12
* Must not be all spaces
*Must not be all zeros.'
type: string
carRental.locationCity:
description: 'The city where the car is rented.
* Format: Alphanumeric
* maxLength: 18
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.locationCountry:
description: 'The country where the car is rented, in [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) format.
* Format: Alphanumeric
* maxLength: 2'
type: string
carRental.locationStateProvince:
description: 'The state or province where the car is rented.
* Format: Alphanumeric
* maxLength: 2
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.noShowIndicator:
description: 'Indicates if the customer didn''t pick up their rental car.
* Y - Customer did not pick up their car
* N - Not applicable'
type: string
carRental.oneWayDropOffCharges:
description: 'The charge for not returning a car to the original rental location, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* maxLength: 12'
type: string
carRental.rate:
description: 'The daily rental rate, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* Format: Alphanumeric
* maxLength: 12'
type: string
carRental.rateIndicator:
description: 'Specifies whether the given rate is applied daily or weekly.
* D - Daily rate
* W - Weekly rate'
type: string
carRental.rentalAgreementNumber:
description: 'The rental agreement number for the car rental.
* Format: Alphanumeric
* maxLength: 9
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.rentalClassId:
description: 'The classification of the rental car.
* Format: Alphanumeric
* maxLength: 4
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.renterName:
description: 'The name of the person renting the car.
* Format: Alphanumeric
* maxLength: 26
* If you send more than 26 characters, the name is truncated
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.returnCity:
description: 'The city where the car must be returned.
* Format: Alphanumeric
* maxLength: 18
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.returnCountry:
description: 'The country where the car must be returned, in [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) format.
* Format: Alphanumeric
* maxLength: 2'
type: string
carRental.returnDate:
description: 'The last date to return the car by.
* Date format: `yyyyMMdd`
* maxLength: 8'
type: string
carRental.returnLocationId:
description: 'The agency code, phone number, or address abbreviation
* Format: Alphanumeric
* maxLength: 10
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.returnStateProvince:
description: 'The state or province where the car must be returned.
* Format: Alphanumeric
* maxLength: 3
* Must not start with a space or be all spaces
*Must not be all zeros.'
type: string
carRental.taxExemptIndicator:
description: 'Indicates if the goods or services were tax-exempt, or if tax was not paid on them.
Values:
* Y - Goods or services were tax exempt
* N - Tax was not collected'
type: string
travelEntertainmentAuthData.duration:
description: 'Number of days the car is rented for. This should be included in the auth message.
* Format: Numeric
* maxLength: 4'
type: string
travelEntertainmentAuthData.market:
description: 'Indicates what market-specific dataset will be submitted or is being submitted. Value should be ''A'' for car rental. This should be included in the auth message.
* Format: Alphanumeric
* maxLength: 1'
type: string
type: object
AdditionalDataLevel23:
properties:
enhancedSchemeData.customerReference:
description: 'The customer code.
* Encoding: ASCII
* Max length: 25 characters
* Must not start with a space or be all spaces
* Must not be all zeros.'
type: string
enhancedSchemeData.destinationCountryCode:
description: 'The three-letter [ISO 3166-1 alpha-3 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) for the destination address.
* Encoding: ASCII
* Fixed length: 3 characters'
type: string
enhancedSchemeData.destinationPostalCode:
description: 'The postal code of the destination address.
* Encoding: ASCII
* Max length: 10 characters
* Must not start with a space'
type: string
enhancedSchemeData.destinationStateProvinceCode:
description: 'Destination state or province code.
* Encoding: ASCII
* Max length: 3 characters
* Must not start with a space'
type: string
enhancedSchemeData.dutyAmount:
description: 'The duty amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* For example, 2000 means USD 20.00.
* Encoding: Numeric
* Max length: 12 characters'
type: string
enhancedSchemeData.freightAmount:
description: 'The shipping amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* For example, 2000 means USD 20.00.
* Encoding: Numeric
*Max length: 12 characters'
type: string
enhancedSchemeData.itemDetailLine[itemNr].commodityCode:
description: 'The [UNSPC commodity code](https://www.unspsc.org/) of the item.
* Encoding: ASCII
* Max length: 12 characters
* Must not start with a space or be all spaces
* Must not be all zeros.'
type: string
enhancedSchemeData.itemDetailLine[itemNr].description:
description: 'A description of the item.
* Encoding: ASCII
* Max length: 26 characters
* Must not start with a space or be all spaces
* Must not be all zeros.'
type: string
enhancedSchemeData.itemDetailLine[itemNr].discountAmount:
description: 'The discount amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* For example, 2000 means USD 20.00.
* Encoding: Numeric
* Max length: 12 characters'
type: string
enhancedSchemeData.itemDetailLine[itemNr].productCode:
description: 'The product code.
* Encoding: ASCII.
* Max length: 12 characters
* Must not start with a space or be all spaces
* Must not be all zeros.'
type: string
enhancedSchemeData.itemDetailLine[itemNr].quantity:
description: 'The number of items. Must be an integer greater than zero.
* Encoding: Numeric
* Max length: 12 characters
* Must not start with a space or be all spaces
'
type: string
enhancedSchemeData.itemDetailLine[itemNr].totalAmount:
description: 'The total amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* For example, 2000 means USD 20.00.
* Max length: 12 characters
* Must not start with a space or be all spaces
* Must not be all zeros.'
type: string
enhancedSchemeData.itemDetailLine[itemNr].unitOfMeasure:
description: 'The unit of measurement for an item.
* Encoding: ASCII
Max length: 3 characters
* Must not start with a space or be all spaces
* Must not be all zeros.'
type: string
enhancedSchemeData.itemDetailLine[itemNr].unitPrice:
description: 'The unit price in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* For example, 2000 means USD 20.00.
* Encoding: Numeric
* Max length: 12 characters
* Must not be all zeros.'
type: string
enhancedSchemeData.orderDate:
description: 'The order date.
* Format: `ddMMyy`
* Encoding: ASCII
* Max length: 6 characters'
type: string
enhancedSchemeData.shipFromPostalCode:
description: 'The postal code of the address the item is shipped from.
* Encoding: ASCII
* Max length: 10 characters
* Must not start with a space or be all spaces
* Must not be all zeros.'
type: string
enhancedSchemeData.totalTaxAmount:
description: 'The total tax amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
* For example, 2000 means USD 20.00.
*Encoding: Numeric
*Max length: 12 characters
* Must not be all zeros.'
type: string
type: object
AdditionalDataWallets:
properties:
androidpay.token:
description: The Android Pay token retrieved from the SDK.
type: string
masterpass.transactionId:
description: The Mastercard Masterpass Transaction ID retrieved from the SDK.
type: string
payment.token:
description: The Apple Pay token retrieved from the SDK.
type: string
paywithgoogle.token:
description: The Google Pay token retrieved from the SDK.
type: string
samsungpay.token:
description: The Samsung Pay token retrieved from the SDK.
type: string
visacheckout.callId:
description: The Visa Checkout Call ID retrieved from the SDK.
type: string
type: object
SplitAmount:
properties:
currency:
description: The three-character [ISO currency code](https://docs.adyen.com/development-resources/currency-codes). By default, this is the original payment currency.
maxLength: 3
minLength: 3
type: string
value:
description: The value of the split amount, in [minor units](https://docs.adyen.com/development-resources/currency-codes).
format: int64
type: integer
required:
- value
type: object
AdditionalDataRatepay:
properties:
ratepay.installmentAmount:
description: Amount the customer has to pay each month.
type: string
ratepay.interestRate:
description: Interest rate of this installment.
type: string
ratepay.lastInstallmentAmount:
description: Amount of the last installment.
type: string
ratepay.paymentFirstday:
description: Calendar day of the first payment.
type: string
ratepaydata.deliveryDate:
description: Date the merchant delivered the goods to the customer.
type: string
ratepaydata.dueDate:
description: Date by which the customer must settle the payment.
type: string
ratepaydata.invoiceDate:
description: Invoice date, defined by the merchant. If not included, the invoice date is set to the delivery date.
type: string
ratepaydata.invoiceId:
description: Identification name or number for the invoice, defined by the merchant.
type: string
type: object
AdditionalDataModifications:
properties:
installmentPaymentData.selectedInstallmentOption:
description: This is the installment option selected by the shopper. It is required only if specified by the user.
type: string
type: object
AdditionalDataOpi:
properties:
opi.includeTransToken:
description: 'Optional boolean indicator. Set to **true** if you want an ecommerce transaction to return an `opi.transToken` as additional data in the response.
You can store this Oracle Payment Interface token in your Oracle Opera database. For more information and required settings, see [Oracle Opera](https://docs.adyen.com/plugins/oracle-opera#opi-token-ecommerce).'
type: string
type: object
AdditionalData3DSecure:
properties:
allow3DS2:
description: "Indicates if you are able to process 3D Secure 2 transactions natively on your payment page. Send this parameter when you are using `/payments` endpoint with any of our [native 3D Secure 2 solutions](https://docs.adyen.com/online-payments/3d-secure/native-3ds2).\n\n > This parameter only indicates readiness to support native 3D Secure 2 authentication. To specify if you _want_ to perform 3D Secure, use [Dynamic 3D Secure](/risk-management/dynamic-3d-secure)\nor send the `executeThreeD` parameter.\nPossible values:\n* **true** - Ready to support native 3D Secure 2 authentication. Setting this to true does not mean always applying 3D Secure 2. Adyen still selects the version of 3D Secure based on configuration to optimize authorisation rates and improve the shopper's experience.\n* **false** – Not ready to support native 3D Secure 2 authentication. Adyen will not offer 3D Secure 2 to your shopper regardless of your configuration.\n"
type: string
challengeWindowSize:
description: "Dimensions of the 3DS2 challenge window to be displayed to the cardholder.\n\nPossible values:\n\n* **01** - size of 250x400 \n* **02** - size of 390x400\n* **03** - size of 500x600\n* **04** - size of 600x400\n* **05** - Fullscreen"
enum:
- '01'
- '02'
- '03'
- '04'
- '05'
type: string
executeThreeD:
description: "Indicates if you want to perform 3D Secure authentication on a transaction.\n\n > Alternatively, you can use [Dynamic 3D Secure](/risk-management/dynamic-3d-secure) to configure rules for applying 3D Secure.\n\nPossible values:\n* **true** – Perform 3D Secure authentication.\n* **false** – Don't perform 3D Secure authentication. Note that this setting results in refusals if the issuer mandates 3D Secure because of the PSD2 directive or other, national regulations. \n"
type: string
mpiImplementationType:
description: In case of Secure+, this field must be set to **CUPSecurePlus**.
type: string
scaExemption:
description: "Indicates the [exemption type](https://docs.adyen.com/payments-fundamentals/psd2-sca-compliance-and-implementation-guide#specifypreferenceinyourapirequest) that you want to request for the transaction.\n\n Possible values:\n* **lowValue** \n* **secureCorporate** \n* **trustedBeneficiary** \n* **transactionRiskAnalysis** "
type: string
threeDSVersion:
description: "Indicates your preference for the 3D Secure version. \n>
# --- truncated at 32 KB (76 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/adyen/refs/heads/main/openapi/adyen-voidpendingrefund-api-openapi.yml