Upgrade checkout-sdk-node to 3.3.0 or later, where the file upload serialization is fixed. If you are stuck on an older version, skip the SDK for uploads and call the files endpoint directly with your HTTP client, passing purpose as a URL query parameter and the file as multipart body. When a file upload fails with purpose_required even though you set the purpose, suspect the SDK's form handling before your own code.

Context: Issue checkout/checkout-sdk-node#418 (closed, 4 comments): files.upload with a file stream and a purpose like dispute_evidence always failed with purpose_required and purpose_invalid. The reporter showed the raw API works when purpose goes in the URL query string, while the SDK stuffed it into multipart form data. A Checkout maintainer confirmed the bug and found the deeper cause: the SDK handed a form-data v4 instance to native fetch, which cannot serialize it, so the field never arrived.