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

# Add Approver

POST https://api.mercoa.com/invoice/{invoiceId}/add-approver
Content-Type: application/json

Adds an approver to the invoice. Will select the first available approver slot that is not already filled and assign the approver to it. If no approver slots are available, an error will be returned. An explicit approver slot can be specified by setting the `approverSlot` field.

Reference: https://docs.mercoa.com/embedded-ap-ar/api-reference/invoice/approval/add-approver

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `invoiceId` (string, required) — Invoice ID or Invoice ForeignID

### Body (application/json)

This endpoint expects an object.

- `userId` (string, required) — The ID or the Foreign ID of the user to add to the approval slot.
- `approvalSlotId` (string, optional) — The identifier for the approval slot this user is assigned to.

## Errors

### 400 Bad Request

- `errorName` ("BadRequest", required)
- `content` (string, required)

### 401 Unauthorized

- `errorName` ("Unauthorized", required)
- `content` (string, required)

### 403 Forbidden

- `errorName` ("Forbidden", required)
- `content` (string, required)

### 404 Not Found

- `errorName` ("NotFound", required)
- `content` (string, required)

### 409 Conflict

- `errorName` ("Conflict", required)
- `content` (string, required)

### 500 Internal Server Error

- `errorName` ("InternalServerError", required)
- `content` (string, required)

### 501 Unimplemented

- `errorName` ("Unimplemented", required)
- `content` (string, required)

## Examples

**Request**

```json
{
  "userId": "user_e24fc81c-c5ee-47e8-af42-4fe29d895506",
  "approvalSlotId": "inap_9bb311c9-7c15-4c9e-8148-63814e0abec6"
}
```

**SDK Code**

```python Default
import requests

url = "https://api.mercoa.com/invoice/in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff/add-approver"

payload = {
    "userId": "user_e24fc81c-c5ee-47e8-af42-4fe29d895506",
    "approvalSlotId": "inap_9bb311c9-7c15-4c9e-8148-63814e0abec6"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```typescript Default
import { MercoaClient } from "@mercoa/javascript";

const client = new MercoaClient({ token: "YOUR_TOKEN" });
await client.invoice.approval.addApprover("in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff", {
    approvalSlotId: "inap_9bb311c9-7c15-4c9e-8148-63814e0abec6",
    userId: "user_e24fc81c-c5ee-47e8-af42-4fe29d895506"
});

```

```go Default
package main

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

func main() {

	url := "https://api.mercoa.com/invoice/in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff/add-approver"

	payload := strings.NewReader("{\n  \"userId\": \"user_e24fc81c-c5ee-47e8-af42-4fe29d895506\",\n  \"approvalSlotId\": \"inap_9bb311c9-7c15-4c9e-8148-63814e0abec6\"\n}")

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

	req.Header.Add("Authorization", "Bearer <token>")
	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 Default
require 'uri'
require 'net/http'

url = URI("https://api.mercoa.com/invoice/in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff/add-approver")

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

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"userId\": \"user_e24fc81c-c5ee-47e8-af42-4fe29d895506\",\n  \"approvalSlotId\": \"inap_9bb311c9-7c15-4c9e-8148-63814e0abec6\"\n}"

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

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

HttpResponse<String> response = Unirest.post("https://api.mercoa.com/invoice/in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff/add-approver")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"userId\": \"user_e24fc81c-c5ee-47e8-af42-4fe29d895506\",\n  \"approvalSlotId\": \"inap_9bb311c9-7c15-4c9e-8148-63814e0abec6\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.mercoa.com/invoice/in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff/add-approver', [
  'body' => '{
  "userId": "user_e24fc81c-c5ee-47e8-af42-4fe29d895506",
  "approvalSlotId": "inap_9bb311c9-7c15-4c9e-8148-63814e0abec6"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Default
using RestSharp;

var client = new RestClient("https://api.mercoa.com/invoice/in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff/add-approver");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"userId\": \"user_e24fc81c-c5ee-47e8-af42-4fe29d895506\",\n  \"approvalSlotId\": \"inap_9bb311c9-7c15-4c9e-8148-63814e0abec6\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Default
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "userId": "user_e24fc81c-c5ee-47e8-af42-4fe29d895506",
  "approvalSlotId": "inap_9bb311c9-7c15-4c9e-8148-63814e0abec6"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.mercoa.com/invoice/in_3d61faa9-1754-4b7b-9fcb-88ff97f368ff/add-approver")! 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()
```