Skip to main content
POST
/
v4
/
accounts
/
{accountId}
/
drafts
Create a draft
curl --request POST \
  --url 'https://api.conductor.com/v4/accounts/{accountId}/drafts?apiKey=&sig=' \
  --header 'Content-Type: application/json' \
  --data '
{
  "draftTitle": "Ultimate Guide to Data Integration",
  "phrases": [
    "data integration platform",
    "data integration tools",
    "financial data integration"
  ],
  "competitorUrls": [
    "https://www.example.com/data-integration",
    "https://www.example.org/guides/data-integration-tools"
  ],
  "rankSourceId": 1
}
'
import requests

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

payload = {
    "draftTitle": "Ultimate Guide to Data Integration",
    "phrases": ["data integration platform", "data integration tools", "financial data integration"],
    "competitorUrls": ["https://www.example.com/data-integration", "https://www.example.org/guides/data-integration-tools"],
    "rankSourceId": 1
}
headers = {"Content-Type": "application/json"}

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

print(response.text)
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    draftTitle: 'Ultimate Guide to Data Integration',
    phrases: [
      'data integration platform',
      'data integration tools',
      'financial data integration'
    ],
    competitorUrls: [
      'https://www.example.com/data-integration',
      'https://www.example.org/guides/data-integration-tools'
    ],
    rankSourceId: 1
  })
};

fetch('https://api.conductor.com/v4/accounts/{accountId}/drafts?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?apiKey=&sig=",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'draftTitle' => 'Ultimate Guide to Data Integration',
    'phrases' => [
        'data integration platform',
        'data integration tools',
        'financial data integration'
    ],
    'competitorUrls' => [
        'https://www.example.com/data-integration',
        'https://www.example.org/guides/data-integration-tools'
    ],
    'rankSourceId' => 1
  ]),
  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?apiKey=&sig="

	payload := strings.NewReader("{\n  \"draftTitle\": \"Ultimate Guide to Data Integration\",\n  \"phrases\": [\n    \"data integration platform\",\n    \"data integration tools\",\n    \"financial data integration\"\n  ],\n  \"competitorUrls\": [\n    \"https://www.example.com/data-integration\",\n    \"https://www.example.org/guides/data-integration-tools\"\n  ],\n  \"rankSourceId\": 1\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(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.conductor.com/v4/accounts/{accountId}/drafts?apiKey=&sig=")
  .header("Content-Type", "application/json")
  .body("{\n  \"draftTitle\": \"Ultimate Guide to Data Integration\",\n  \"phrases\": [\n    \"data integration platform\",\n    \"data integration tools\",\n    \"financial data integration\"\n  ],\n  \"competitorUrls\": [\n    \"https://www.example.com/data-integration\",\n    \"https://www.example.org/guides/data-integration-tools\"\n  ],\n  \"rankSourceId\": 1\n}")
  .asString();
require 'uri'
require 'net/http'

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

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  \"draftTitle\": \"Ultimate Guide to Data Integration\",\n  \"phrases\": [\n    \"data integration platform\",\n    \"data integration tools\",\n    \"financial data integration\"\n  ],\n  \"competitorUrls\": [\n    \"https://www.example.com/data-integration\",\n    \"https://www.example.org/guides/data-integration-tools\"\n  ],\n  \"rankSourceId\": 1\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>"
}

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

Body

application/json
draftTitle
string
required

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

rankSourceId
integer
required

Rank source identifier.

id
string<uuid>

Client-supplied draft identifier. If omitted, one is generated.

phrases
string[]

Target keyword phrases the draft is optimized for.

page
string

Existing page to optimize in your draft.

webPropertyId
integer

Web property identifier.

title
string
metaDescription
string
bodyCopy
string

The body copy / main text content of the draft.

competitorUrls
string<uri>[]

Competitor URLs used to generate insights from for this draft.

contentProfileId
string<uuid>

Content Profile identifier.

referenceDocumentIds
string<uuid>[]

Reference Document identifiers.

Response

Draft created

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.