{"openapi":"3.1.0","info":{"title":"CopyJump REST API","version":"1.0.0","description":"Create and manage standalone Content or tracked Tasks, and optionally schedule the CopyJump content agent. REST API keys are scoped to one brand. AI assistants should normally use the CopyJump MCP server instead."},"externalDocs":{"description":"CopyJump API documentation","url":"https://copyjump.com/api"},"servers":[{"url":"https://app.copyjump.com/api/v1","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Content","description":"Standalone and Task-linked markdown documents and editorial state."},{"name":"Tasks","description":"Durable work items and their canonical workflow state."},{"name":"Agent","description":"Scheduling for the CopyJump content agent."}],"paths":{"/content":{"get":{"operationId":"listContent","tags":["Content"],"summary":"List content","description":"List content records for the brand selected by the API key. Bodies are omitted from list results.","parameters":[{"name":"status","in":"query","description":"Filter by editorial lifecycle status.","schema":{"type":"string","enum":["draft","review","approved","published"]}},{"name":"synced","in":"query","description":"Filter by external synchronization state.","schema":{"type":"boolean"}},{"name":"archived","in":"query","description":"List archived content. Defaults to false.","schema":{"type":"boolean"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Content records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentListResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createContent","tags":["Content"],"summary":"Create standalone Content","description":"Create an ordinary markdown document without a Task. The document starts unsynced, unarchived, and not marked as agent-generated.","requestBody":{"required":true,"description":"The title and optional complete markdown body, SEO metadata, and editorial status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContentInput"}}}},"responses":{"201":{"description":"Created content record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/content/{id}":{"get":{"operationId":"getContent","tags":["Content"],"summary":"Get content","description":"Fetch one content record, including its markdown body.","parameters":[{"name":"id","in":"path","required":true,"description":"Content ID.","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Content record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Content was not found in the selected brand or visibility scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"updateContent","tags":["Content"],"summary":"Update Content","description":"Update the title, complete markdown body, individual SEO metadata values, or lifecycle fields. Document changes create a normal revision.","parameters":[{"name":"id","in":"path","required":true,"description":"Content ID.","schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"description":"At least one supported document or lifecycle field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContentInput"}}}},"responses":{"200":{"description":"Updated content record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Content was not found or cannot be updated through the public API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tasks":{"get":{"operationId":"listTasks","tags":["Tasks"],"summary":"List Tasks","description":"List durable Tasks by workflow status or archive view.","parameters":[{"name":"view","in":"query","description":"Task view. Defaults to active work.","schema":{"type":"string","enum":["active","done","archived","all"],"default":"active"}},{"name":"status","in":"query","description":"Filter by canonical workflow status. open and archived are deprecated compatibility aliases for the matching views.","schema":{"type":"string","enum":["backlog","todo","in_progress","review","done","open","archived"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Tasks.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createTask","tags":["Tasks"],"summary":"Create a Task","description":"Create a durable work item. This does not start the CopyJump agent.","requestBody":{"required":true,"description":"The Task brief.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskInput"}}}},"responses":{"201":{"description":"Created Task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tasks/{id}":{"get":{"operationId":"getTask","tags":["Tasks"],"summary":"Get a Task","description":"Fetch one Task, including workflow, agent execution, and linked content metadata.","parameters":[{"name":"id","in":"path","required":true,"description":"Task ID.","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Task was not found in the selected brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"patch":{"operationId":"updateTask","tags":["Tasks"],"summary":"Update a Task","description":"Update planning fields, workflow status, assignment, or archive state.","parameters":[{"name":"id","in":"path","required":true,"description":"Task ID.","schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"description":"At least one supported Task field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTaskInput"}}}},"responses":{"200":{"description":"Updated Task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Task was not found in the selected brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tasks/{id}/agent":{"post":{"operationId":"scheduleTaskAgent","tags":["Agent"],"summary":"Schedule or unschedule the content agent","description":"Start, queue, schedule, or unschedule agent work for a Task. The operation returns immediately; poll the Task for workflow and execution state.","parameters":[{"name":"id","in":"path","required":true,"description":"Task ID.","schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"description":"The desired scheduling action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleTaskAgentInput"}}}},"responses":{"200":{"description":"Updated Task and scheduling message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Task was not found in the selected brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The current agent job cannot be unscheduled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"CopyJump could not complete the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"CopyJump API key","description":"A brand-scoped CopyJump API key beginning with cj_live_. The key selects the brand; callers do not pass brand or organization IDs."}},"schemas":{"ApiError":{"type":"object","required":["error"],"properties":{"error":{"$ref":"#/components/schemas/ApiErrorDetail"}}},"ApiErrorDetail":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"},"field":{"type":"string","description":"The invalid field, when the error applies to one field."}}},"Pagination":{"type":"object","required":["limit","offset","has_more"],"properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"has_more":{"type":"boolean"}}},"ContentSummary":{"type":"object","required":["id","title","status","synced","archived","created","updated"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","review","approved","published"]},"synced":{"type":"boolean"},"archived":{"type":"boolean"},"url":{"type":["string","null"],"description":"Confirmed live page URL. Null when not set. Paths resolve against the Brand website."},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"}}},"Content":{"allOf":[{"$ref":"#/components/schemas/ContentSummary"},{"type":"object","required":["body","metadata"],"properties":{"body":{"type":"string","description":"The complete content document as markdown."},"metadata":{"type":"object","required":["title","description"],"properties":{"title":{"type":["string","null"]},"description":{"type":["string","null"]}}}}}]},"ContentListResponse":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ContentSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"ContentResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Content"}}},"ContentMetadataInput":{"type":"object","minProperties":1,"additionalProperties":false,"properties":{"title":{"type":["string","null"],"description":"SEO title. Null clears the current value."},"description":{"type":["string","null"],"description":"SEO description. Null clears the current value."}}},"CreateContentInput":{"type":"object","additionalProperties":false,"required":["title"],"properties":{"title":{"type":"string","minLength":1},"body":{"type":"string","default":"","description":"The complete markdown document body."},"metadata":{"$ref":"#/components/schemas/ContentMetadataInput"},"status":{"type":"string","enum":["draft","review","approved","published"],"default":"draft"},"url":{"type":["string","null"],"description":"Confirmed live page URL or path. Null clears it. Paths need the Brand website."}}},"UpdateContentInput":{"type":"object","minProperties":1,"additionalProperties":false,"properties":{"title":{"type":"string","minLength":1},"body":{"type":"string","description":"The complete replacement markdown document body."},"metadata":{"$ref":"#/components/schemas/ContentMetadataInput"},"status":{"type":"string","enum":["draft","review","approved","published"]},"synced":{"type":"boolean"},"archived":{"type":"boolean"},"url":{"type":["string","null"],"description":"Confirmed live page URL or path. Null clears it. Paths need the Brand website."}}},"TaskSource":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"type":{"const":"web_page"},"title":{"type":"string","minLength":1},"url":{"type":"string","minLength":1},"content":{"type":"string","minLength":1}}},"TaskInputFields":{"type":"object","properties":{"title":{"type":"string","minLength":1},"instructions":{"type":"string","minLength":1},"content_type":{"type":["string","null"],"enum":["auto","tutorial","documentation","announcement","landing-page","thought-leadership","personal-post","article","editorial-seo","comparison","case-study","social-post",null],"description":"Use auto when CopyJump should select the best structure."},"brand_voice":{"type":["string","null"],"description":"Saved brand voice ID, or null to let CopyJump choose."},"primary_keyword":{"type":["string","null"],"minLength":1},"supporting_keywords":{"type":"array","items":{"type":"string","minLength":1}},"target_url":{"type":["string","null"],"minLength":1,"description":"Path on the site for this page, like /blog/my-post."},"sources":{"type":"array","items":{"$ref":"#/components/schemas/TaskSource"}}}},"CreateTaskInput":{"allOf":[{"$ref":"#/components/schemas/TaskInputFields"},{"type":"object","required":["instructions"],"properties":{"type":{"type":"string","enum":["other","content_creation","content_rewriting"],"default":"content_creation","description":"content_creation = new page, content_rewriting = update live pages, other = a to-do that is not a page. write, rewrite, and general are accepted aliases."},"status":{"type":"string","enum":["backlog","todo","in_progress","review","done"],"default":"backlog"}}}]},"UpdateTaskInput":{"allOf":[{"$ref":"#/components/schemas/TaskInputFields"},{"type":"object","minProperties":1,"properties":{"archived":{"type":"boolean"},"assignee":{"type":"string","enum":["me","none"]},"progress":{"type":"string","enum":["todo","in_progress","done"],"deprecated":true,"description":"Legacy workflow field. Prefer status."},"visibility":{"type":"string","enum":["active","archived"],"deprecated":true,"description":"Legacy archive field. Prefer archived."},"status":{"type":"string","enum":["backlog","todo","in_progress","review","done","open","archived"],"description":"Canonical workflow status. open and archived are deprecated archive aliases and are never stored."}}}]},"TaskSummary":{"type":"object","required":["id","title","status","archived","completed_at","content_type","brand_voice","primary_keyword","supporting_keywords","target_url","type","assignee","content_id","content","agent","created","updated"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["backlog","todo","in_progress","review","done"]},"archived":{"type":"boolean"},"completed_at":{"type":["string","null"],"format":"date-time"},"content_type":{"type":["string","null"]},"brand_voice":{"type":["string","null"]},"primary_keyword":{"type":["string","null"]},"supporting_keywords":{"type":"array","items":{"type":"string"}},"target_url":{"type":["string","null"]},"type":{"type":"string","enum":["other","content_creation","content_rewriting"]},"assignee":{"type":"string"},"content_id":{"type":["string","null"]},"content":{"oneOf":[{"type":"object","required":["id","title","status","updated"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":["string","null"]},"updated":{"type":["string","null"],"format":"date-time"}}},{"type":"null"}]},"agent":{"oneOf":[{"type":"object","required":["state","scheduled_for","error"],"properties":{"state":{"type":"string"},"scheduled_for":{"type":["string","null"],"format":"date-time"},"error":{"type":["string","null"]}}},{"type":"null"}]},"created":{"type":["string","null"],"format":"date-time"},"updated":{"type":["string","null"],"format":"date-time"}}},"Task":{"allOf":[{"$ref":"#/components/schemas/TaskSummary"},{"type":"object","required":["instructions","sources"],"properties":{"instructions":{"type":"string"},"sources":{"type":"array","items":{"$ref":"#/components/schemas/TaskSource"}}}}]},"TaskListResponse":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TaskSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"TaskResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Task"},"message":{"type":"string"}}},"ScheduleTaskAgentInput":{"type":"object","additionalProperties":false,"required":["schedule"],"properties":{"schedule":{"type":"string","minLength":1,"description":"Use now, next_available, unschedule, or an ISO 8601 date-time.","examples":["next_available","now","unschedule","2026-08-23T09:00:00.000Z"]}}}}}}