Projects
List, create, read, update, and archive MisarSEO projects — /seo/projects and /seo/projects/:projectId.
A project owns a domain. Every audit, keyword, tracker, and report in MisarSEO is scoped to one.
List projects
/seo/projectsReturns every project in the caller's organization. Takes no parameters and is not rate limited.
This endpoint auto-creates
If the organization has no projects, one is created and returned. projects is never empty.
Response fields
projectsobject[]Project records.
curl https://api.misar.io/seo/projects \
-H "Authorization: Bearer $MISARSEO_API_KEY"{
"projects": [
{ "id": "5b1c7d2e-…", "name": "Acme", "domain": "acme.com" }
]
}Create a project
/seo/projectsRequest body
namestringbodyrequiredProject name. Trimmed; must be non-empty.
domainstringbodyThe primary domain this project tracks.
Response fields
projectobjectThe created project.
curl -X POST https://api.misar.io/seo/projects \
-H "Authorization: Bearer $MISARSEO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Acme", "domain": "acme.com" }'{ "project": { "id": "5b1c7d2e-…", "name": "Acme", "domain": "acme.com" } }Rate limit: 30 requests per 60 s.
Get a project
/seo/projects/:projectIdPath parameters
projectIdstringpathrequiredProject id.
Response fields
projectobjectThe project record.
curl https://api.misar.io/seo/projects/5b1c7d2e-… \
-H "Authorization: Bearer $MISARSEO_API_KEY"{ "project": { "id": "5b1c7d2e-…", "name": "Acme", "domain": "acme.com" } }Not rate limited.
Update a project
/seo/projects/:projectIdAt least one of name or domain must be present. Omitted keys are left unchanged.
Request body
namestringbodyNew name. Must be non-empty if supplied.
domainstring | nullbodyNew domain. Pass null to clear it.
Response fields
projectobjectThe updated project.
curl -X PATCH https://api.misar.io/seo/projects/5b1c7d2e-… \
-H "Authorization: Bearer $MISARSEO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "domain": "acme.io" }'{ "project": { "id": "5b1c7d2e-…", "name": "Acme", "domain": "acme.io" } }Rate limit: 30 requests per 60 s. Sending neither name nor domain, or an empty name, returns 400 VALIDATION_ERROR.
Archive a project
/seo/projects/:projectIdArchive, not delete
The project is archived, not destroyed. Its audits, keywords, and tracking history remain intact.
Response fields
successbooleantrue when the project was archived.
curl -X DELETE https://api.misar.io/seo/projects/5b1c7d2e-… \
-H "Authorization: Bearer $MISARSEO_API_KEY"{ "success": true }Rate limit: 30 requests per 60 s.
Status codes
| Code | Meaning |
|---|---|
200 | Read, updated, or archived |
201 | Created |
400 | VALIDATION_ERROR — invalid JSON, missing name, or no updatable keys |
401 | UNAUTHENTICATED |
404 | NOT_FOUND — no such project in your organization |
429 | RATE_LIMITED — includes Retry-After |
See Errors for the full code table.