{"openapi":"3.1.0","info":{"title":"Writer (BYOK) API","version":"0.1.0","description":"Writer (BYOK) lets an AI assistant read your own Writer data through the Writer API with a key you supply (Writer API key). Read-only: 9 tools (list_models, list_files, get_file, list_graphs, get_graph, list_applications, list_application_graphs, list_application_jobs, get_job). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-writer.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-writer/docs"},"termsOfService":"https://connectorbay.com/byok-writer/terms"},"servers":[{"url":"https://byok-writer.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-writer/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_models":{"post":{"operationId":"list_models","summary":"List the Palmyra models the key can use, with their ids and names. Use for \"Which Writer Palmyra models can I use\".","description":"List the Palmyra models the key can use, with their ids and names. Use for \"Which Writer Palmyra models can I use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_modelsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_files":{"post":{"operationId":"list_files","summary":"List files uploaded to Writer with processing status and the knowledge graphs they belong to; supports cursor paging. Us","description":"List files uploaded to Writer with processing status and the knowledge graphs they belong to; supports cursor paging. Use for \"Which files have I uploaded to Writer and have they finished processing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"desc","description":"Sort order by creation time: asc or desc.","title":"Order"},"before":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor: return items before this id (use the first_id of a page to go backwards).","title":"Before"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor: return items after this id (use the last_id of a page to go forwards).","title":"After"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items to return (the API default is 50).","title":"Limit"},"graph_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only files attached to this knowledge graph id.","title":"Graph Id"},"status":{"anyOf":[{"enum":["in_progress","completed","failed"],"type":"string"},{"type":"null"}],"default":null,"description":"Only files with this status: in_progress, completed or failed.","title":"Status"}},"title":"list_filesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_file":{"post":{"operationId":"get_file","summary":"Get one uploaded file's name, processing status, creation time and graph ids. Use for \"What is the status of Writer file","description":"Get one uploaded file's name, processing status, creation time and graph ids. Use for \"What is the status of Writer file file_123\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"file_id":{"description":"File id, as returned by list_files.","maxLength":200,"title":"File Id","type":"string"}},"required":["file_id"],"title":"get_fileArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_graphs":{"post":{"operationId":"list_graphs","summary":"List knowledge graphs with type (manual, connector or web), description and file processing counts; supports cursor pagi","description":"List knowledge graphs with type (manual, connector or web), description and file processing counts; supports cursor paging. Use for \"What knowledge graphs do I have in Writer and how many files are in each\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"desc","description":"Sort order by creation time: asc or desc.","title":"Order"},"before":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor: return items before this id (use the first_id of a page to go backwards).","title":"Before"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor: return items after this id (use the last_id of a page to go forwards).","title":"After"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items to return (the API default is 50).","title":"Limit"}},"title":"list_graphsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_graph":{"post":{"operationId":"get_graph","summary":"Get one knowledge graph's type, description and file processing counts. Use for \"How many files in Writer graph graph_12","description":"Get one knowledge graph's type, description and file processing counts. Use for \"How many files in Writer graph graph_123 failed to process\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"graph_id":{"description":"Knowledge graph id, as returned by list_graphs.","maxLength":200,"title":"Graph Id","type":"string"}},"required":["graph_id"],"title":"get_graphArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_applications":{"post":{"operationId":"list_applications","summary":"List no-code agents (applications) with status (deployed or draft), inputs and deployment times; supports cursor paging.","description":"List no-code agents (applications) with status (deployed or draft), inputs and deployment times; supports cursor paging. Use for \"Which Writer no-code agents are deployed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"desc","description":"Sort order by creation time: asc or desc.","title":"Order"},"before":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor: return items before this id (use the first_id of a page to go backwards).","title":"Before"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor: return items after this id (use the last_id of a page to go forwards).","title":"After"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many items to return (the API default is 50).","title":"Limit"},"type":{"anyOf":[{"const":"generation","type":"string"},{"type":"null"}],"default":null,"description":"Only applications of this type (the API documents one value: generation).","title":"Type"}},"title":"list_applicationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_application_graphs":{"post":{"operationId":"list_application_graphs","summary":"List the knowledge graph ids attached to one no-code agent. Use for \"Which knowledge graphs does Writer application app_","description":"List the knowledge graph ids attached to one no-code agent. Use for \"Which knowledge graphs does Writer application app_123 use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"application_id":{"description":"Application id, as returned by list_applications.","maxLength":200,"title":"Application Id","type":"string"}},"required":["application_id"],"title":"list_application_graphsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_application_jobs":{"post":{"operationId":"list_application_jobs","summary":"List asynchronous jobs created for one no-code agent with status and timing; page with offset and limit. Use for \"Which ","description":"List asynchronous jobs created for one no-code agent with status and timing; page with offset and limit. Use for \"Which async jobs for Writer application app_123 have failed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"application_id":{"description":"Application id, as returned by list_applications.","maxLength":200,"title":"Application Id","type":"string"},"status":{"anyOf":[{"enum":["in_progress","completed","failed"],"type":"string"},{"type":"null"}],"default":null,"description":"Only jobs with this status: in_progress, failed or completed.","title":"Status"},"offset":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"How many jobs to skip.","title":"Offset"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"How many jobs to return (the docs state no maximum).","title":"Limit"}},"required":["application_id"],"title":"list_application_jobsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_job":{"post":{"operationId":"get_job","summary":"Get the status and timing of one asynchronous application job. Use for \"Is Writer async job job_123 finished\".","description":"Get the status and timing of one asynchronous application job. Use for \"Is Writer async job job_123 finished\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"job_id":{"description":"Job id, as returned by list_application_jobs.","maxLength":200,"title":"Job Id","type":"string"}},"required":["job_id"],"title":"get_jobArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}