---
title: "The appointment's testimonial link for a customer (any workspace member who can see the contact). Creates the first one, reopens the open one, renews an expired one; replaces_link_id replaces it or starts a new request after a submission (a retry returns the same successor)."
description: "Body: { replaces_link_id? }. Response: { link: { id, state open|opened|submitted|revoked|expired, url, expires_at, opened_at, submitted_at }, created, stale, can_new_link }. 404 appointment_missing, 409 contact_missing."
---

> Documentation Index
> Fetch the complete documentation index at: https://developer.channelautomations.com/llms.txt
> Use this file to discover all available pages before exploring further.

Path: Channel Automation API › Field Sales

`POST /api/field-sales/appointments/{id}/testimonial-link`

Body: { replaces_link_id? }. Response: { link: { id, state open|opened|submitted|revoked|expired, url, expires_at, opened_at, submitted_at }, created, stale, can_new_link }. 404 appointment_missing, 409 contact_missing.

## Code samples

### cURL

```bash
curl --request POST \
  --url https://api.channelautomation.com/api/field-sales/appointments/%7Bid%7D/testimonial-link
```

### TypeScript

```typescript
const url = 'https://api.channelautomation.com/api/field-sales/appointments/%7Bid%7D/testimonial-link';
const options = {method: 'POST'};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://api.channelautomation.com/api/field-sales/appointments/%7Bid%7D/testimonial-link"

response = requests.post(url)

print(response.text)
```


Source: https://developer.channelautomations.com/api/post-api-field-sales-appointments-id-testimonial-link/index.md
