# 

A sale authorizes the card and captures the funds in a single request. Use it when you deliver at the moment of payment — a digital download, a subscription charge, a service that completes right away.

If you ship later, [authorize now and capture when you ship](/docs/payments/authorize-and-capture) instead.

## Before you start

* Your `Api-Key` and `Client-Id` — see [Authentication](/docs/get-started/authentication)
* A processor integration configured for cards


## Send the sale

`POST /v1/transactions` with `type` set to `SALE`.

The fields that decide whether this works:

| Field | Notes |
|  --- | --- |
| `type` | `SALE`. A card also accepts `AUTH`. It does **not** accept `PAYOUT` |
| `amount` | Integer, smallest currency unit. `10000` is 100.00 USD. Minimum `50` |
| `payment_method.type` | `CARD` |
| `payment_method.pan` | 14 to 19 digits |
| `payment_method.expiry` | An object of two **integers**: `month` 1–12, `year` four digits |
| `payment_method.cvv` | 3 or 4 digits. Optional, but send it when the cardholder is present |
| `payment_method.billing_address` | Drives AVS. Optional, and worth sending |
| `payment_method.entry_method` | How you took the card details. `ECOMMERCE`, the default, or `MOTO`. Both are Card Not Present |
| `currency` | `USD` is the only accepted value, and the default |


Two mistakes are easy to make here.

* **`expiry` is nested, and its parts are integers.** `"month": 1`, not `"expiry_month": "01"`.
* **The name fields are `first_name` and `last_name`**, inside `payment_method`. There is no `cardholder_name`.


## Read the response

```json 200 application/json
{
  "id": "TRANSACTION-01KEW32V6YNV11T33XGDR7TGWC",
  "reference_transaction_id": null,
  "type": "SALE",
  "result": "APPROVED",
  "client_id": "CLIENT-01KFDKXMQ637EKEAY410MSQSXB",
  "client_dba": "Acme Jewelry",
  "integrations": [
    "TSYS"
  ],
  "response_code": "00",
  "response_description": "Approved",
  "batch_id": null,
  "is_settled": false,
  "time_created": "2026-07-15T14:22:05Z",
  "amount": 10000,
  "tip": 0,
  "tax_amount": 500,
  "currency": "USD",
  "payment_method": {
    "type": "CARD",
    "truncated_pan": "****-****-****-5439",
    "payment_token": "CARD_TOKEN-01KFDKXMQ637EKEAY410MSQSXB",
    "expiry": {
      "month": "01",
      "year": "2028"
    },
    "first_name": "John",
    "last_name": "Doe",
    "entry_method": "ECOMMERCE",
    "auth_code": "123456",
    "retrieval_reference_number": "000000603076",
    "card_type": "UNKNOWN",
    "card_brand": "Visa",
    "cvv_result_code": "M",
    "avs_result_code": "Y",
    "avs_response": "Exact Match - Street address and postal code match"
  },
  "recurring": false,
  "initiator": "CUSTOMER",
  "network_transaction_id": "000000004271001",
  "metadata": {
    "order_id": "ORD-10432",
    "sales_channel": "web",
    "customer_reference": "cust-8891"
  }
}
```

```json 400 application/json
{
  "error_code": "INVALID_REQUEST_DATA",
  "error_message": "The API request contains invalid data.",
  "details": {
    "amount": "Invalid amount",
    "payment_method.pan": "Malformed PAN"
  },
  "source": {
    "system": "TSYS",
    "code": "13",
    "message": "Invalid amount"
  }
}
```

```json 401 application/json
{
  "error_code": "NOT_AUTHENTICATED",
  "error_message": "Access credentials missing or invalid.",
  "details": null,
  "source": {
    "system": null,
    "code": null,
    "message": null
  }
}
```

```json 403 application/json
{
  "error_code": "UNAUTHORIZED_ACTION",
  "error_message": "Requested action is unavailable or forbidden.",
  "details": null,
  "source": {
    "system": null,
    "code": null,
    "message": null
  }
}
```

```json 409 application/json
{
  "error_code": "DUPLICATE_ACTION",
  "error_message": "Duplicate action requested.",
  "details": null,
  "source": {
    "system": "TSYS",
    "code": "12",
    "message": "Invalid transaction"
  }
}
```

```json 500 application/json
{
  "error_code": "SYSTEM_ERROR",
  "error_message": "Internal system error.",
  "details": null,
  "source": {
    "system": "TSYS",
    "code": "96",
    "message": "System malfunction"
  }
}
```

```json 502 application/json
{
  "error_code": "DOWNSTREAM_ERROR",
  "error_message": "Downstream service returned invalid or unexpected response.",
  "details": null,
  "source": {
    "system": "VERICHECK",
    "code": "502",
    "message": "Bad Gateway"
  }
}
```

```json 503 application/json
{
  "error_code": "string",
  "error_message": "string",
  "details": {
    "property1": "string",
    "property2": "string"
  },
  "source": {
    "system": "TSYS",
    "code": "51",
    "message": "Insufficient funds"
  }
}
```

Check `result` first. `APPROVED` means the money is yours at the next batch close; `DECLINED` means the issuer said no; `ERROR` means the transaction could not be attempted. All three come back as `200`.

A few fields deserve attention.

* **`payment_method.payment_token`** is a token for this card, issued as a side effect of the transaction. Store it and you never need the number again. See [Save and reuse a payment method](/docs/payments/save-and-reuse-a-payment-method).
* **`payment_method.avs_result_code`** says how much of the billing address matched. `Y` is a full match, `Z` postal code only, `N` neither. See [AVS and CVV](/docs/concepts/avs-and-cvv).
* **`payment_method.card_type` is always `UNKNOWN` here.** The processor does not report it on an authorization. Read the transaction back from `GET /v1/transactions/{id}` for the real value.
* **`batch_id`** is the settlement batch. It is null until the batch settles, so a null value on a new sale is normal.
* **`payment_method.entry_method`** echoes the value you sent.


## Take a payment by phone or mail

When an operator keys in card details that the cardholder gave over the phone or by mail, set `payment_method.entry_method` to `MOTO`. Everything else about the sale is the same.

The CVV is optional on a MOTO sale. Leave it out of a mail order, where the cardholder should not write it down. Without it, `cvv_result_code` comes back null.

## Next steps

* [Authorize and capture separately](/docs/payments/authorize-and-capture)
* [Save and reuse a payment method](/docs/payments/save-and-reuse-a-payment-method)
* [Handle declines](/docs/payments/handle-declines)