Skip to main content
PUT
/
v4
/
accounts
/
{accountId}
/
drafts
/
{draftId}
Update a draft
curl --request PUT \
  --url 'https://api.conductor.com/v4/accounts/{accountId}/drafts/{draftId}?apiKey=&sig=' \
  --header 'Content-Type: application/json' \
  --data '
{
  "draftTitle": "Updated Draft",
  "phrases": [
    "Updated phrases"
  ],
  "competitorUrls": [
    "https://www.example.com/data-integration",
    "https://www.example.org/guides/data-integration-tools"
  ],
  "title": "Updated title",
  "metaDescription": "Updated meta description",
  "bodyCopy": "Updated body copy"
}
'
import requests

url = "https://api.conductor.com/v4/accounts/{accountId}/drafts/{draftId}?apiKey=&sig="

payload = {
"draftTitle": "Updated Draft",
"phrases": ["Updated phrases"],
"competitorUrls": ["https://www.example.com/data-integration", "https://www.example.org/guides/data-integration-tools"],
"title": "Updated title",
"metaDescription": "Updated meta description",
"bodyCopy": "Updated body copy"
}
headers = {"Content-Type": "application/json"}

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

print(response.text)
const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
draftTitle: 'Updated Draft',
phrases: ['Updated phrases'],
competitorUrls: [
'https://www.example.com/data-integration',
'https://www.example.org/guides/data-integration-tools'
],
title: 'Updated title',
metaDescription: 'Updated meta description',
bodyCopy: 'Updated body copy'
})
};

fetch('https://api.conductor.com/v4/accounts/{accountId}/drafts/{draftId}?apiKey=&sig=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.conductor.com/v4/accounts/{accountId}/drafts/{draftId}?apiKey=&sig=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'draftTitle' => 'Updated Draft',
'phrases' => [
'Updated phrases'
],
'competitorUrls' => [
'https://www.example.com/data-integration',
'https://www.example.org/guides/data-integration-tools'
],
'title' => 'Updated title',
'metaDescription' => 'Updated meta description',
'bodyCopy' => 'Updated body copy'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

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

func main() {

url := "https://api.conductor.com/v4/accounts/{accountId}/drafts/{draftId}?apiKey=&sig="

payload := strings.NewReader("{\n \"draftTitle\": \"Updated Draft\",\n \"phrases\": [\n \"Updated phrases\"\n ],\n \"competitorUrls\": [\n \"https://www.example.com/data-integration\",\n \"https://www.example.org/guides/data-integration-tools\"\n ],\n \"title\": \"Updated title\",\n \"metaDescription\": \"Updated meta description\",\n \"bodyCopy\": \"Updated body copy\"\n}")

req, _ := http.NewRequest("PUT", 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(string(body))

}
HttpResponse<String> response = Unirest.put("https://api.conductor.com/v4/accounts/{accountId}/drafts/{draftId}?apiKey=&sig=")
.header("Content-Type", "application/json")
.body("{\n \"draftTitle\": \"Updated Draft\",\n \"phrases\": [\n \"Updated phrases\"\n ],\n \"competitorUrls\": [\n \"https://www.example.com/data-integration\",\n \"https://www.example.org/guides/data-integration-tools\"\n ],\n \"title\": \"Updated title\",\n \"metaDescription\": \"Updated meta description\",\n \"bodyCopy\": \"Updated body copy\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.conductor.com/v4/accounts/{accountId}/drafts/{draftId}?apiKey=&sig=")

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

request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"draftTitle\": \"Updated Draft\",\n \"phrases\": [\n \"Updated phrases\"\n ],\n \"competitorUrls\": [\n \"https://www.example.com/data-integration\",\n \"https://www.example.org/guides/data-integration-tools\"\n ],\n \"title\": \"Updated title\",\n \"metaDescription\": \"Updated meta description\",\n \"bodyCopy\": \"Updated body copy\"\n}"

response = http.request(request)
puts response.read_body
{
  "accountId": 123,
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "draftTitle": "<string>",
  "phrases": [
    "<string>"
  ],
  "page": "<string>",
  "rankSourceId": 123,
  "webPropertyId": 123,
  "versionId": "<string>",
  "title": "<string>",
  "metaDescription": "<string>",
  "bodyCopy": "<string>",
  "created": "2026-06-28T23:19:03.026-04:00",
  "createdBy": 123,
  "updated": "2026-06-28T23:19:03.026-04:00",
  "updatedBy": 123,
  "assignee": 123,
  "competitorUrls": [
    "<string>"
  ],
  "contentProfileId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
{
"timestamp": "2023-11-07T05:31:56Z",
"status": 123,
"error": "<string>",
"message": "<string>",
"path": "<string>"
}
{
"code": "<string>",
"message": "<string>"
}
{
"timestamp": "2023-11-07T05:31:56Z",
"status": 123,
"error": "<string>",
"message": "<string>",
"path": "<string>"
}
{
"timestamp": "2023-11-07T05:31:56Z",
"status": 123,
"error": "<string>",
"message": "<string>",
"path": "<string>"
}
{
"timestamp": "2023-11-07T05:31:56Z",
"status": 123,
"error": "<string>",
"message": "<string>",
"path": "<string>"
}

Authorizations

apiKey
string
query
required

API Key as a query parameter

sig
string
query
required

Request signature computed using API key and secret. Valid for 5 minutes after creation.

Path Parameters

accountId
integer
required

Account identifier

draftId
string<uuid>
required

Draft identifier

Body

application/json

Fields that can be updated on a writing assistant draft.

draftTitle
string

Draft title. (Note: not your page's title tag)

phrases
string[]

Target keyword phrases the draft is optimized for.

competitorUrls
string<uri>[]

Competitor URLs used to generate insights from for this draft.

title
string
metaDescription
string
bodyCopy
string
contentProfileId
string<uuid>

Content Profile identifier.

referenceDocumentIds
string<uuid>[]

Reference Document identifiers.

page
string

Existing page to optimize in your draft.

Response

Updated draft

accountId
integer

Account identifier.

id
string<uuid>

Draft identifier

Example:

"3fa85f64-5717-4562-b3fc-2c963f66afa6"

draftTitle
string

Draft title. (Note: not your page's title tag)

phrases
string[]

Target keyword phrases the draft is optimized for.

page
string

Existing page to optimize in your draft.

rankSourceId
integer

Rank source identifier.

webPropertyId
integer

Web property identifier.

versionId
string

Identifier of the specific draft version.

title
string
metaDescription
string
bodyCopy
string

The body copy / main text content of the draft.

created
string<date-time>

created timestamp

Example:

"2026-06-28T23:19:03.026-04:00"

createdBy
integer
updated
string<date-time>

last updated timestamp

Example:

"2026-06-28T23:19:03.026-04:00"

updatedBy
integer

User id of the last user to make an update.

assignee
integer

User id of the user assigned to this draft.

status
enum<string>

Draft status.

Available options:
TO_DO,
IN_PROGRESS,
IN_REVIEW,
APPROVED,
PUBLISHED
competitorUrls
string[]

Competitor URLs used to generate insights from for this draft.

contentProfileId
string<uuid>

Content Profile identifier.