Projects API Documentation

Projects

List all projects

Parameters

No parameters.

Returns

Returns a list of projects for the user.

Request

GET /api/v2/projects
curl https://app.contentharmony.com/api/v2/projects \
  -X GET \
  -u {{token}}:{{secret}} \
  -H 'Content-Type: application/json'
fetch('https://app.contentharmony.com/api/v2/projects', {
  method: 'GET',
  headers: {
    'Authorization': `Basic ${btoa('{{token}}:<span class="password-hidden" data-reveal-target="maskable">{{secret}}</span>')}`,
    'Content-Type': 'application/json'
  }
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
import requests
import json

url = 'https://app.contentharmony.com/api/v2/projects'
auth = ('{{token}}', '{{secret}}')
headers = {'Content-Type': 'application/json'}

response = requests.get(url, auth=auth, headers=headers)
print(response.json())
require 'net/http'
require 'json'

uri = URI('https://app.contentharmony.com/api/v2/projects')
request = Net::HTTP::Get.new(uri)
request.basic_auth('{{token}}', '{{secret}}')
request['Content-Type'] = 'application/json'

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts JSON.parse(response.body)

Response

{
  "object": "list",
  "data": [
    {
      "object": "project",
      "id": 1,
      "name": "Project A",
      "team_id": 1,
      "domain": null,
      "default_country_code": "US",
      "default_lang_code": "en",
      "created_at": "2025-06-12T13:05:45.405Z"
    },
    {
      "object": "project",
      "id": 2,
      "name": "Project B",
      "team_id": 1,
      "domain": null,
      "default_country_code": "US",
      "default_lang_code": "en",
      "created_at": "2026-04-12T13:05:45.406Z"
    }
  ]
}

Retrieve a project

Parameters

No parameters.

Returns

Returns a project if a valid project ID was provided. Returns an error otherwise.

Request

GET /api/v2/projects/1
curl https://app.contentharmony.com/api/v2/projects/1 \
  -X GET \
  -u {{token}}:{{secret}} \
  -H 'Content-Type: application/json'
fetch('https://app.contentharmony.com/api/v2/projects/1', {
  method: 'GET',
  headers: {
    'Authorization': `Basic ${btoa('{{token}}:<span class="password-hidden" data-reveal-target="maskable">{{secret}}</span>')}`,
    'Content-Type': 'application/json'
  }
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
import requests
import json

url = 'https://app.contentharmony.com/api/v2/projects/1'
auth = ('{{token}}', '{{secret}}')
headers = {'Content-Type': 'application/json'}

response = requests.get(url, auth=auth, headers=headers)
print(response.json())
require 'net/http'
require 'json'

uri = URI('https://app.contentharmony.com/api/v2/projects/1')
request = Net::HTTP::Get.new(uri)
request.basic_auth('{{token}}', '{{secret}}')
request['Content-Type'] = 'application/json'

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts JSON.parse(response.body)

Response

{
  "object": "project",
  "id": 1,
  "name": "Project A",
  "team_id": 1,
  "domain": null,
  "default_country_code": "US",
  "default_lang_code": "en",
  "created_at": "2025-06-12T13:05:45.424Z"
}

Create a project

Parameters

team_id required
The ID of an existing team for the user.
name required
The name of the project.
domain optional
We use this to help you find internal linking recommendations. We recommend using your entire domain (yoursite.com), but if you want internal linking options that are more specific, you can specify just one subdomain (blog.yoursite.com), or even a subfolder (www.yoursite.com/blog/). Do not include the https:// part.
default_country_code optional, default is team default country code
Two-letter default country code for project, in uppercase.
default_lang_code optional, default is team default language code
Default language code for project, in lowercase.

Returns

Returns the project if it was created successfully.

Request

POST /api/v2/projects
curl https://app.contentharmony.com/api/v2/projects \
  -X POST \
  -u {{token}}:{{secret}} \
  -H 'Content-Type: application/json' \
  -d '{"team_id":1,"name":"Special Project","domain":"special.example.com","default_country_code":"US","default_lang_code":"en"}'
fetch('https://app.contentharmony.com/api/v2/projects', {
  method: 'POST',
  headers: {
    'Authorization': `Basic ${btoa('{{token}}:<span class="password-hidden" data-reveal-target="maskable">{{secret}}</span>')}`,
    'Content-Type': 'application/json'
  }
  body: JSON.stringify({"team_id":1,"name":"Special Project","domain":"special.example.com","default_country_code":"US","default_lang_code":"en"})
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
import requests
import json

url = 'https://app.contentharmony.com/api/v2/projects'
auth = ('{{token}}', '{{secret}}')
headers = {'Content-Type': 'application/json'}
data = {"team_id":1,"name":"Special Project","domain":"special.example.com","default_country_code":"US","default_lang_code":"en"}

response = requests.post(url, auth=auth, headers=headers, json=data)
print(response.json())
require 'net/http'
require 'json'

uri = URI('https://app.contentharmony.com/api/v2/projects')
request = Net::HTTP::Post.new(uri)
request.basic_auth('{{token}}', '{{secret}}')
request['Content-Type'] = 'application/json'
request.body = {"team_id":1,"name":"Special Project","domain":"special.example.com","default_country_code":"US","default_lang_code":"en"}

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts JSON.parse(response.body)

Response

{
  "object": "project",
  "id": 1,
  "name": "Special Project",
  "team_id": 1,
  "domain": null,
  "default_country_code": "US",
  "default_lang_code": "en",
  "created_at": "2026-06-12T13:04:45.433Z"
}

Update a project

Parameters

name required
The name of the project.
domain optional
We use this to help you find internal linking recommendations. We recommend using your entire domain (yoursite.com), but if you want internal linking options that are more specific, you can specify just one subdomain (blog.yoursite.com), or even a subfolder (www.yoursite.com/blog/). Do not include the https:// part.
default_country_code optional
Two-letter default country code for project, in uppercase.
default_lang_code optional
Default language code for project, in lowercase.

Returns

Returns the project if it was updated successfully.

Request

PUT /api/v2/projects/1
curl https://app.contentharmony.com/api/v2/projects/1 \
  -X PUT \
  -u {{token}}:{{secret}} \
  -H 'Content-Type: application/json' \
  -d '{"name":"Updated Project","domain":"updated.example.com","default_country_code":"CA","default_lang_code":"fr"}'
fetch('https://app.contentharmony.com/api/v2/projects/1', {
  method: 'PUT',
  headers: {
    'Authorization': `Basic ${btoa('{{token}}:<span class="password-hidden" data-reveal-target="maskable">{{secret}}</span>')}`,
    'Content-Type': 'application/json'
  }
  body: JSON.stringify({"name":"Updated Project","domain":"updated.example.com","default_country_code":"CA","default_lang_code":"fr"})
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
import requests
import json

url = 'https://app.contentharmony.com/api/v2/projects/1'
auth = ('{{token}}', '{{secret}}')
headers = {'Content-Type': 'application/json'}
data = {"name":"Updated Project","domain":"updated.example.com","default_country_code":"CA","default_lang_code":"fr"}

response = requests.put(url, auth=auth, headers=headers, json=data)
print(response.json())
require 'net/http'
require 'json'

uri = URI('https://app.contentharmony.com/api/v2/projects/1')
request = Net::HTTP::Put.new(uri)
request.basic_auth('{{token}}', '{{secret}}')
request['Content-Type'] = 'application/json'
request.body = {"name":"Updated Project","domain":"updated.example.com","default_country_code":"CA","default_lang_code":"fr"}

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts JSON.parse(response.body)

Response

{
  "object": "project",
  "id": 1,
  "name": "Updated Project",
  "team_id": 1,
  "domain": null,
  "default_country_code": "CA",
  "default_lang_code": "fr",
  "created_at": "2026-06-12T13:04:45.452Z"
}