Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions docs/SDKs/quote-go.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,10 @@ quote, err := qc.UpdateQuote(ctx, "quote-uuid", req)

Available null-clear helpers: `ClearPriceBookID`, `ClearValidUntil`, `ClearTaxRate`, `ClearRenewalPeriod`.

:::info `Name` is trimmed, and renaming is draft-only
`Name` is trimmed on both `CreateQuote` and `UpdateQuote` — `" Acme "` is stored as `"Acme"` — and a name that is empty once trimmed returns a `400`. A quote can only be renamed while it is a **draft**; on any other status the update is rejected with `Cannot update quote that is not in draft status` (`TemplateID` is the only field exempt from that rule). Rename before you send, because **sending snapshots the quote's current name onto the TurboSign document** — that is the name signers see in the request email and on the signed PDF.
:::

#### DeleteQuote

```go
Expand All @@ -304,6 +308,8 @@ Creates a new draft quote as a copy of the specified quote.
copy, err := qc.DuplicateQuote(ctx, "quote-uuid")
```

The copy is named **`Copy of <original name>`**, truncated to the name column's 255-character limit. Rename it with `UpdateQuote` before sending if that is not what you want signers to see.

The copy is attributed to **whoever ran the duplicate**, not to the original quote's creator — duplicating with an API key produces a quote whose "Prepared by" resolves through that API key and your org quote template.

#### ApplyPriceBook
Expand Down Expand Up @@ -468,18 +474,22 @@ quote, err := qc.VoidQuote(ctx, "quote-uuid", &turbodocx.VoidQuoteRequest{

Handles a `sent` quote that has passed its `validUntil` date. The endpoint **closes out the original quote** — voiding or declining it depending on `Action` — and then **creates a duplicate carrying `NewValidUntil`** as its new validity date. The returned quote is the new duplicate; the original stays terminal.

`Action` is `"void"` or `"decline"`. All three fields are **required**: `Action`, `Reason` (max 190 characters), and `NewValidUntil` (ISO date).
`Action` (`"void"`, `"decline"` or `"renew"`) and `NewValidUntil` (ISO date) are **required**. `Reason` (max 190 characters) is required for `"void"` and `"decline"`, and optional for `"renew"` — a renewal closes nothing out, so there is nothing to give a reason for. Use `"renew"` when the quote's signature request has already expired on its own; use `"void"` or `"decline"` when the quote is merely past its `ValidUntil` and you are closing it yourself.

```go
quote, err := qc.HandleExpiredQuote(ctx, "quote-uuid", &turbodocx.HandleExpiredQuoteRequest{
Action: "void", // required — "void" or "decline" only
Reason: "Customer requested more time", // required — max 190 characters
Action: "void", // required — "void", "decline" or "renew"
Reason: "Customer requested more time", // required for void/decline, optional for renew
NewValidUntil: "2026-10-01", // required — ISO date, carried onto the duplicate
})
```

:::warning There is no `extend` or `resend` action
`Action` accepts **only** `"void"` and `"decline"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does — pass `NewValidUntil` and it lands on the duplicate it creates.
`Action` accepts **only** `"void"`, `"decline"` and `"renew"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does — pass `NewValidUntil` and it lands on the duplicate it creates.
:::

:::info The replacement draft keeps the original name
Unlike `DuplicateQuote`, the draft this endpoint creates is **not** prefixed with `Copy of ` — re-issuing the same deal keeps the original quote's name, so repeated renewals cannot compound into `Copy of Copy of …`. That matters because the next send snapshots the name onto the TurboSign document.
:::

#### DownloadQuotePdf
Expand Down
18 changes: 14 additions & 4 deletions docs/SDKs/quote-java.md
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,10 @@ req.setTermDays(60);
Quote updated = tq.updateQuote(quoteId, req);
```

:::info `name` is trimmed, and renaming is draft-only
`name` is trimmed on both `createQuote` and `updateQuote` — `" Acme "` is stored as `"Acme"` — and a name that is empty once trimmed returns a `400`. A quote can only be renamed while it is a **draft**; on any other status the update is rejected with `Cannot update quote that is not in draft status` (`templateId` is the only field exempt from that rule). Rename before you send, because **sending snapshots the quote's current name onto the TurboSign document** — that is the name signers see in the request email and on the signed PDF.
:::

#### `deleteQuote`

```java
Expand All @@ -352,6 +356,8 @@ Quote copy = tq.duplicateQuote(quoteId);
System.out.println("New quote: " + copy.getId());
```

The copy is named **`Copy of <original name>`**, truncated to the name column's 255-character limit. Rename it with `updateQuote` before sending if that is not what you want signers to see.

The copy is attributed to **whoever ran the duplicate**, not to the original quote's creator — duplicating with an API key produces a quote whose "Prepared by" resolves through that API key and your org quote template.

#### `applyPriceBook`
Expand Down Expand Up @@ -559,19 +565,23 @@ Quote handleExpiredQuote(String id, HandleExpiredQuoteRequest request)

Handle a quote that has passed its `validUntil` date. The endpoint **closes out the original quote** — voiding or declining it depending on the action — and then **creates a duplicate carrying `newValidUntil`** as its new validity date. The returned `Quote` is the new duplicate; the original stays terminal.

All three fields are **required**: `action` (`"void"` or `"decline"`), `reason` (max 190 characters), and `newValidUntil` (ISO date).
`action` (`"void"`, `"decline"` or `"renew"`) and `newValidUntil` (ISO date) are **required**. `reason` (max 190 characters) is required for `"void"` and `"decline"`, and optional for `"renew"` — a renewal closes nothing out, so there is nothing to give a reason for. Use `"renew"` when the quote's signature request has already expired on its own; use `"void"` or `"decline"` when the quote is merely past its `validUntil` and you are closing it yourself.

```java
HandleExpiredQuoteRequest req = new HandleExpiredQuoteRequest();
req.setAction("void"); // required — "void" or "decline" only
req.setReason("Expired — re-quoting"); // required — max 190 characters
req.setAction("void"); // required — "void", "decline" or "renew"
req.setReason("Expired — re-quoting"); // required for void/decline, optional for renew
req.setNewValidUntil("2026-12-31"); // required — ISO date, carried onto the duplicate

Quote quote = tq.handleExpiredQuote(quoteId, req);
```

:::warning There is no `extend` or `resend` action
`action` accepts **only** `"void"` and `"decline"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does — set `newValidUntil` and it lands on the duplicate it creates.
`action` accepts **only** `"void"`, `"decline"` and `"renew"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does — set `newValidUntil` and it lands on the duplicate it creates.
:::

:::info The replacement draft keeps the original name
Unlike `duplicateQuote`, the draft this endpoint creates is **not** prefixed with `Copy of ` — re-issuing the same deal keeps the original quote's name, so repeated renewals cannot compound into `Copy of Copy of …`. That matters because the next send snapshots the name onto the TurboSign document.
:::

:::note Terminal statuses
Expand Down
18 changes: 14 additions & 4 deletions docs/SDKs/quote-javascript.md
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,10 @@ const updated = await TurboQuote.updateQuote('quote-uuid', {
});
```

:::info `name` is trimmed, and renaming is draft-only
`name` is trimmed on both `createQuote` and `updateQuote` — `' Acme '` is stored as `'Acme'` — and a name that is empty once trimmed returns a `400`. A quote can only be renamed while it is a **draft**; on any other status the update is rejected with `Cannot update quote that is not in draft status` (`templateId` is the only field exempt from that rule). Rename before you send, because **sending snapshots the quote's current name onto the TurboSign document** — that is the name signers see in the request email and on the signed PDF.
:::

#### deleteQuote

Soft-delete a quote.
Expand All @@ -324,6 +328,8 @@ Copy a quote (and its line items) into a new draft.
const copy = await TurboQuote.duplicateQuote('quote-uuid');
```

The copy is named **`Copy of <original name>`**, truncated to the name column's 255-character limit. Rename it with `updateQuote` before sending if that is not what you want signers to see.

The copy is attributed to **whoever ran the duplicate**, not to the original quote's creator — duplicating with an API key produces a quote whose "Prepared by" resolves through that API key and your org quote template.

#### applyPriceBook
Expand Down Expand Up @@ -494,18 +500,22 @@ const quote = await TurboQuote.voidQuote('quote-uuid', {

Handle a quote that has passed its `validUntil` date. The endpoint **closes out the original quote** — voiding or declining it depending on `action` — and then **creates a duplicate draft carrying `newValidUntil`** as its new validity date. The returned quote is the new duplicate; the original stays terminal.

All three fields are **required**: `action` (`'void'` or `'decline'`), `reason` (≤ 190 characters), and `newValidUntil` (ISO date).
`action` (`'void'`, `'decline'` or `'renew'`) and `newValidUntil` (ISO date) are **required**. `reason` (≤ 190 characters) is required for `'void'` and `'decline'`, and optional for `'renew'` — a renewal closes nothing out, so there is nothing to give a reason for. Use `'renew'` when the quote's signature request has already expired on its own; use `'void'` or `'decline'` when the quote is merely past its `validUntil` and you are closing it yourself.

```typescript
const quote = await TurboQuote.handleExpiredQuote('quote-uuid', {
action: 'void', // 'void' | 'decline' — the only two valid actions
reason: 'Expired — re-quoting', // required, max 190 chars
action: 'void', // 'void' | 'decline' | 'renew'
reason: 'Expired — re-quoting', // required for void/decline, optional for renew
newValidUntil: '2026-08-31', // required, ISO date carried onto the duplicate
});
```

:::warning There is no `extend` or `resend` action
`action` accepts **only** `"void"` and `"decline"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does for you — pass `newValidUntil` and it lands on the duplicate it creates.
`action` accepts **only** `"void"`, `"decline"` and `"renew"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does for you — pass `newValidUntil` and it lands on the duplicate it creates.
:::

:::info The replacement draft keeps the original name
Unlike `duplicateQuote`, the draft this endpoint creates is **not** prefixed with `Copy of ` — re-issuing the same deal keeps the original quote's name, so repeated renewals cannot compound into `Copy of Copy of …`. That matters because the next send snapshots the name onto the TurboSign document.
:::

---
Expand Down
18 changes: 14 additions & 4 deletions docs/SDKs/quote-php.md
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,10 @@ $quote = TurboQuote::updateQuote('quote-uuid', new UpdateQuoteRequest(
));
```

:::info `name` is trimmed, and renaming is draft-only
`name` is trimmed on both `createQuote` and `updateQuote` — `' Acme '` is stored as `'Acme'` — and a name that is empty once trimmed returns a `400`. A quote can only be renamed while it is a **draft**; on any other status the update is rejected with `Cannot update quote that is not in draft status` (`templateId` is the only field exempt from that rule). Rename before you send, because **sending snapshots the quote's current name onto the TurboSign document** — that is the name signers see in the request email and on the signed PDF.
:::

#### deleteQuote

```php
Expand All @@ -274,6 +278,8 @@ $copy = TurboQuote::duplicateQuote('quote-uuid');
echo "Copy id: {$copy->id}";
```

The copy is named **`Copy of <original name>`**, truncated to the name column's 255-character limit. Rename it with `updateQuote` before sending if that is not what you want signers to see.

The copy is attributed to **whoever ran the duplicate**, not to the original quote's creator — duplicating with an API key produces a quote whose "Prepared by" resolves through that API key and your org quote template.

#### downloadQuotePdf
Expand Down Expand Up @@ -372,20 +378,24 @@ $quote = TurboQuote::voidQuote('quote-uuid', new VoidQuoteRequest(

Handles a quote that has passed its `validUntil` date. The endpoint **closes out the original quote** — voiding or declining it depending on `action` — and then **creates a duplicate carrying `newValidUntil`** as its new validity date. The returned quote is the new duplicate; the original stays terminal.

All three arguments are **required**: `action` (`'void'` or `'decline'`), `reason` (max 190 characters), and `newValidUntil` (ISO date).
`action` (`'void'`, `'decline'` or `'renew'`) and `newValidUntil` (ISO date) are **required**. `reason` (max 190 characters) is required for `'void'` and `'decline'`, and optional for `'renew'` — a renewal closes nothing out, so there is nothing to give a reason for. Use `'renew'` when the quote's signature request has already expired on its own; use `'void'` or `'decline'` when the quote is merely past its `validUntil` and you are closing it yourself.

```php
use TurboDocx\Types\Requests\Quote\HandleExpiredQuoteRequest;

$quote = TurboQuote::handleExpiredQuote('quote-uuid', new HandleExpiredQuoteRequest(
action: 'void', // required — 'void' or 'decline' only
reason: 'Customer requested more time to review', // required — max 190 characters
action: 'void', // required — 'void', 'decline' or 'renew'
reason: 'Customer requested more time to review', // required for void/decline, optional for renew
newValidUntil: '2026-12-31', // required — ISO date, carried onto the duplicate
));
```

:::warning There is no `extend` or `resend` action
`action` accepts **only** `'void'` and `'decline'`. `'extend'` and `'resend'` do not exist in the API and return a `400`. Extending is what the endpoint already does — pass `newValidUntil` and it lands on the duplicate it creates.
`action` accepts **only** `'void'`, `'decline'` and `'renew'`. `'extend'` and `'resend'` do not exist in the API and return a `400`. Extending is what the endpoint already does — pass `newValidUntil` and it lands on the duplicate it creates.
:::

:::info The replacement draft keeps the original name
Unlike `duplicateQuote`, the draft this endpoint creates is **not** prefixed with `Copy of ` — re-issuing the same deal keeps the original quote's name, so repeated renewals cannot compound into `Copy of Copy of …`. That matters because the next send snapshots the name onto the TurboSign document.
:::

:::note Terminal statuses
Expand Down
18 changes: 14 additions & 4 deletions docs/SDKs/quote-python.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,10 @@ updated = await TurboQuote.update_quote("quote-uuid", {
})
```

:::info `name` is trimmed, and renaming is draft-only
`name` is trimmed on both `create_quote` and `update_quote` — `" Acme "` is stored as `"Acme"` — and a name that is empty once trimmed returns a `400`. A quote can only be renamed while it is a **draft**; on any other status the update is rejected with `Cannot update quote that is not in draft status` (`templateId` is the only field exempt from that rule). Rename before you send, because **sending snapshots the quote's current name onto the TurboSign document** — that is the name signers see in the request email and on the signed PDF.
:::

#### `delete_quote`

```python
Expand All @@ -276,6 +280,8 @@ new_quote = await TurboQuote.duplicate_quote("quote-uuid")
# returns new Quote in draft status
```

The copy is named **`Copy of <original name>`**, truncated to the name column's 255-character limit. Rename it with `update_quote` before sending if that is not what you want signers to see.

The copy is attributed to **whoever ran the duplicate**, not to the original quote's creator — duplicating with an API key produces a quote whose "Prepared by" resolves through that API key and your org quote template.

#### `download_quote_pdf`
Expand Down Expand Up @@ -421,18 +427,22 @@ quote = await TurboQuote.void_quote("quote-uuid", {

Handles a quote that has passed its `validUntil` date. The endpoint **closes out the original quote** — voiding or declining it depending on `action` — and then **creates a duplicate carrying `newValidUntil`** as its new validity date. The returned quote is the new duplicate; the original stays terminal.

All three keys are **required**: `action` (`"void"` or `"decline"`), `reason` (max 190 characters), and `newValidUntil` (ISO date).
`action` (`"void"`, `"decline"` or `"renew"`) and `newValidUntil` (ISO date) are **required**. `reason` (max 190 characters) is required for `"void"` and `"decline"`, and optional for `"renew"` — a renewal closes nothing out, so there is nothing to give a reason for. Use `"renew"` when the quote's signature request has already expired on its own; use `"void"` or `"decline"` when the quote is merely past its `validUntil` and you are closing it yourself.

```python
quote = await TurboQuote.handle_expired_quote("quote-uuid", {
"action": "void", # required — "void" or "decline" only
"reason": "Quote expired", # required — max 190 characters
"action": "void", # required — "void", "decline" or "renew"
"reason": "Quote expired", # required for void/decline, optional for renew
"newValidUntil": "2026-12-31", # required — ISO date carried onto the duplicate
})
```

:::warning There is no `extend` or `resend` action
`action` accepts **only** `"void"` and `"decline"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does — pass `newValidUntil` and it lands on the duplicate it creates.
`action` accepts **only** `"void"`, `"decline"` and `"renew"`. `"extend"` and `"resend"` do not exist in the API and return a `400`. Extending is what the endpoint already does — pass `newValidUntil` and it lands on the duplicate it creates.
:::

:::info The replacement draft keeps the original name
Unlike `duplicate_quote`, the draft this endpoint creates is **not** prefixed with `Copy of ` — re-issuing the same deal keeps the original quote's name, so repeated renewals cannot compound into `Copy of Copy of …`. That matters because the next send snapshots the name onto the TurboSign document.
:::

:::note Terminal statuses
Expand Down
Loading
Loading