> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.milenow.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.milenow.com/_mcp/server.

# Log in as a transporter

POST https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login
Content-Type: application/json

No token needed. Log in with the email or username and password the transporter owner or team member uses on the Mile web app. The token lasts 90 minutes and works only on `/transporters` endpoints. See [authentication](/ftl-trips/authentication#transporter-login).

Reference: https://docs.milenow.com/ftl-trips/api-reference/transporter-api/transporter-login

## Request

### Body (application/json)

This endpoint expects a TransporterLoginRequest.

- `user` (string, required) — Email or username.
- `password` (string, required)

## Response

### 200

Success

- `status` (integer, required)
- `msg` (string, required)
- `msgs` (list of string, required)
- `data` (TransporterLoginData, required)

## Errors

### 401 Unauthorized Error

Wrong login, or the transporter account is disabled.

- `status` (integer, required) — Same as the HTTP status code.
- `msg` (string, required) — Summary of the problem. When there are several problems it says how many.
- `msgs` (list of string, required) — Every problem found. Validation lists all problems at once, so fix them all before you retry.
- `data` (list of any, required) — Always an empty list on errors.

### 412 Precondition Failed Error

`user` or `password` is missing.

- `status` (integer, required) — Same as the HTTP status code.
- `msg` (string, required) — Summary of the problem. When there are several problems it says how many.
- `msgs` (list of string, required) — Every problem found. Validation lists all problems at once, so fix them all before you retry.
- `data` (list of any, required) — Always an empty list on errors.

## Types

### TransporterLoginData

- `access_token` (string, optional)
- `expiry_time` (string, optional) — Local time when the token expires.
- `transporter` (TransporterLoginDataTransporter, optional)
- `user` (TransporterLoginDataUser, optional)

### TransporterLoginDataTransporter

- `id` (integer, optional)
- `name` (string, optional)

### TransporterLoginDataUser

- `id` (integer, optional)
- `name` (string, optional)
- `is_owner` (boolean, optional) — `false` for a team member.

## Examples

**Request**

```json
{
  "user": "dispatch@desertline.example",
  "password": "<password>"
}
```

**Response**

```json
{
  "status": 200,
  "msg": "Logged in successfully",
  "msgs": [],
  "data": {
    "access_token": "<transporter-token>",
    "expiry_time": "2026-10-28 16:10:23",
    "transporter": {
      "id": 7019257,
      "name": "Desert Line Transport"
    },
    "user": {
      "id": 7019257,
      "name": "Desert Line Transport",
      "is_owner": true
    }
  }
}
```

**SDK Code**

```python Example
import requests

url = "https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login"

payload = {
    "user": "dispatch@desertline.example",
    "password": "<password>"
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Example
const url = 'https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"user":"dispatch@desertline.example","password":"<password>"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Example
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login"

	payload := strings.NewReader("{\n  \"user\": \"dispatch@desertline.example\",\n  \"password\": \"<password>\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Example
require 'uri'
require 'net/http'

url = URI("https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"user\": \"dispatch@desertline.example\",\n  \"password\": \"<password>\"\n}"

response = http.request(request)
puts response.read_body
```

```java Example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login")
  .header("Content-Type", "application/json")
  .body("{\n  \"user\": \"dispatch@desertline.example\",\n  \"password\": \"<password>\"\n}")
  .asString();
```

```php Example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login', [
  'body' => '{
  "user": "dispatch@desertline.example",
  "password": "<password>"
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Example
using RestSharp;

var client = new RestClient("https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"user\": \"dispatch@desertline.example\",\n  \"password\": \"<password>\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Example
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "user": "dispatch@desertline.example",
  "password": "<password>"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://lastmile.milenow.com/index.php/api/v1/partners/transporters/login")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```