# 3. Conversion upload API

:::tip
For the full documentation please visit: [https://docs.dripcel.com](https://docs.dripcel.com/)

:::


**Sales** and/or **Conversion** can be uploaded via a `POST` request or the traditional, postback-via-URL, `GET` request.


To post a sale back you will need:

* API `key` with the required permissions: `["sale.create"]`


* One of either: `campaign_id` or `send_id` or `click_id` to match the sale back to the correct campaign. If you use **more than one** of these IDs your upload will fail.
* The `cell` of the associated sale
* The `soldAt` date if applicable (If blank, the current datetime is used)
* As well as the `saleValue` (If no saleValue is present, the `defaultSaleValue` of the corresponding campaign will be used).



:::caution
**Note:** If the sales you are uploading are from `Campaigns V2`, you need to send the cell in international phone number format, example, South Africa: `27631231234`.

:::


### GET REQUEST / POSTBACK URL

`url:` `POST` `https://api.dripcel.com/sales/create`

This is used to post single sales back, if you want to upload multiple sales, use the POST request.



:::caution
**Note:** If a timestamp is included in in `soldAt` it **must** be [encoded](https://www.urlencoder.org/).

:::


**Non-encoded:** `2025-10-14 16:47:36` | **Encoded**: `2025-10-14%2016%3A47%3A36`


**Example (No Timestamp)**

`https://api.dripcel.com/sales/create?key=KEY&soldAt=2025-10-14&campaign_id=CAMPAIGN_ID&cell=27112223333`


**Example (Encoded Timestamp)**

`https://api.dripcel.com/sales/create?key=KEY&soldAt=2025-10-14%2009%3A02%3A51&campaign_id=CAMPAIGN_ID&cell=27112223333`


### POST REQUEST / Bulk

`url:` `GET` `https://api.dripcel.com/sales`


**Body**

```typescript
type Sales = {
  /** The campaign ID associated with the sale */
  campaign_id: string;
  /** The send_id ID associated with the sale */
  send_id: string;
  /** The click_id ID associated with the sale */
  click_id?: string;
  /** The cell number of the contact who converted the sale. Can be in local or international format (if local, the country of the corresponding campaign will be used) */
  cell: string;
  /** The date the sale was made. Must be in ISO format (YYYY-MM-DD), and doesn't have to include time. If blank, the current datetime is used. */
  soldAt?: string;
  /** The value of the sale. If blank, the `defaultSaleValue` of the corresponding campaign will be used */
  saleValue?: number;
}[];
```


**Headers**

```typescript
{ "Authorization": "Bearer <key>" }
```


**Example**

```typescript
[
  {
    "cell": "0111111111",
    "campaign_id": "639978184d735c88ed8bbd68"
  },
  {
    "saleValue": 100,
    "cell": "0111111112",
    "soldAt": "2023-02-14",
    "campaign_id": "639978184d735c88ed8bbd68",
  }
]
```


### Response

**Success**

```ts
{
  ok: true;
}
```

**Error**

```ts
{
  ok: false;
  error: "Campaign not found";
}
```

```ts
{
  ok: false;
  // A sale is considered a duplicate if it has the same cell number, campaign_id, and soldAt date as an existing sale
  error: "Duplicate sale";
}
```