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
- JavaScript
- Python
- Ruby
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
- JavaScript
- Python
- Ruby
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 thehttps://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
- JavaScript
- Python
- Ruby
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 thehttps://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
- JavaScript
- Python
- Ruby
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"
}