The anti-corruption layer is one file and it earns its keep

A third-party model that leaks into your domain spreads their vocabulary through your code, and the translation belongs in one place.

final class PaymentGatewayAdapter
{
    public function capture(Money $amount, CardToken $token): Capture
    {
        $response = $this->client->post('/v2/charges', [
            'amount'   => $amount->cents(),
            'currency' => strtolower($amount->currency()),
            'source'   => $token->value(),
        ]);

        return new Capture(
            reference: $response['id'],
            captured: Money::fromCents($response['amount_captured'], ...),
        );
    }
}

The value shows up at the provider migration, when the number of files that mention their field names is one rather than forty. It also makes the integration testable without their sandbox, because the boundary is a class with a signature in your vocabulary. The cost is a translation nobody enjoys writing and a temptation to let one of their concepts through “just this once”, which is how the layer stops working.