Skip to content
Connect an agent

Organisations

Edit a tab with typed operations

Applies edit_diagram operations to the tab on the board, on its current source.

POST/orgs/{org}/boards/{board}/tabs/{tab}/edits

TL;DR

QuestionAnswer
What does it do?Edit a tab with typed operations.
What does it take?A JSON body of type EditBoardTabBody.
What does it return?Status 200 with a body of type BoardWriteResult.
What can go wrong?400 the body is not valid; 401 not signed in; 403 boards are not turned on for this organisation (boards.not_enabled), the caller may look but not change it (boards.forbidden), or the request came from an origin that may not make changes; 404 no such organisation, board or tab, or the board is not open to the caller: the cases look alike; 409 the tab changed since the version sent (diagram.version_conflict, details.currentVersion), the board has as many tabs as it may (boards.tab_limit), the last tab cannot go (boards.last_tab), or the organisation is on legal hold (orgs.legal_hold); 413 the source is longer than a tab may be (boards.source_too_long), or the board holds as much as it may (boards.storage_full); 422 the source has errors (diagram.invalid, the diagnostics in details), an edit did not apply (boards.operation_failed, details.results), or it holds something that looks like a secret and the organisation blocks them (boards.secret_blocked); 429 too many requests; 503 organisations or boards are not set up on this server. Every failure uses the one error envelope.

What it does

Applies edit_diagram operations to the tab on the board, on its current source. Made against an older version, the operations are applied to the current one when they still apply; if any does not, none is kept and the answer is 409 diagram.version_conflict with the results. The result parses, passes the secret scan, and every open browser gets it with what changed.

Path parameters

FieldTypeRequiredDescription
orgstringyesThe organisation's id or its slug.
boardstringyesThe board's id: 22 letters and digits.
tabstringyesThe tab's id: 12 letters and digits.

Request body

The body has the type EditBoardTabBody.

FieldTypeRequiredDescription
baseVersionintegeryes
operationsobject[]yes
operations[].op"rename" | "set" | "add_node" | "remove" | "add_edge" | "remove_edge" | "move" | "replace_text"yes
operations[].targetstringnoId, label, table.column, or "header". at most 2000 characters.
operations[].tostringnorename: the new name. Edges: the end. at most 2000 characters.
operations[].fromstringnoEdges: the start. at most 2000 characters.
operations[].optionstringnoat most 40 characters; pattern ^[a-z][A-Za-z0-9_-]*$.
operations[].valuestring | nullnoset: null removes the option. at most 2000 characters.
operations[].idstringnoat most 2000 characters.
operations[].labelstringnoadd_edge on sankey: the amount. at most 2000 characters.
operations[].typestringnoadd_node: node type, or statement word (c4 person, tree dir). at most 2000 characters.
operations[].optionsobjectno
operations[].statementstringnoadd_node: the whole line, for a kind with no plain node statement. at most 2000 characters.
operations[].intostring | nullnoA block; null is the top level. at most 2000 characters.
operations[].afterstringnoat most 2000 characters.
operations[].arrow"<-->" | "-->" | "<->" | "..>" | "->" | "--"no
operations[].findstringnoat most 2000 characters.
operations[].replacestringnoat most 2000 characters.
operations[].allbooleanno

Responses

StatusMeaningBody
200The new version, what changed, and the board.BoardWriteResult
400The body is not valid.ErrorResponse
401Not signed in.ErrorResponse
403Boards are not turned on for this organisation (boards.not_enabled), the caller may look but not change it (boards.forbidden), or the request came from an origin that may not make changes.ErrorResponse
404No such organisation, board or tab, or the board is not open to the caller: the cases look alike.ErrorResponse
409The tab changed since the version sent (diagram.version_conflict, details.currentVersion), the board has as many tabs as it may (boards.tab_limit), the last tab cannot go (boards.last_tab), or the organisation is on legal hold (orgs.legal_hold).ErrorResponse
413The source is longer than a tab may be (boards.source_too_long), or the board holds as much as it may (boards.storage_full).ErrorResponse
422The source has errors (diagram.invalid, the diagnostics in details), an edit did not apply (boards.operation_failed, details.results), or it holds something that looks like a secret and the organisation blocks them (boards.secret_blocked).ErrorResponse
429Too many requests.ErrorResponse
503Organisations or boards are not set up on this server.ErrorResponse

Response body

A 200 answer has the type BoardWriteResult.

FieldTypeRequiredDescription
changedbooleanyesFalse when the write changed nothing; nothing was stored.
versionintegeryes
tabanyyes
tab.idstringyesat least 12 characters; at most 12 characters; pattern ^[0-9A-Za-z]+$.
tab.namestringyes
tab.kindstringyesThe kind the source declares, such as flow.
tab.positionnumberyes
tab.versionintegeryes
tab.updatedAtintegeryes
tab.updatedBystringyesWho changed it last: an email address, an agent and its member, or a key name.
tab.libraryobject | nullyes
tab.library.diagramIdstringyes
tab.library.versionintegeryes
tab.library.savedbooleanyesTrue while the tab holds what was saved or imported.
headBoardHeadyes
head.idstringyesat least 22 characters; at most 22 characters; pattern ^[0-9A-Za-z]+$.
head.orgIdstringyes
head.versionintegeryes
head.tabsBoardTab[]yes
head.tabs[].idstringyesat least 12 characters; at most 12 characters; pattern ^[0-9A-Za-z]+$.
head.tabs[].namestringyes
head.tabs[].kindstringyesThe kind the source declares, such as flow.
head.tabs[].positionnumberyes
head.tabs[].versionintegeryes
head.tabs[].updatedAtintegeryes
head.tabs[].updatedBystringyesWho changed it last: an email address, an agent and its member, or a key name.
head.tabs[].libraryobject | nullyes
resultsobject[]yes
results[].opstringyes
results[].appliedbooleanyes
results[].linesinteger[]yes
results[].messagestringyes
results[].hintstring | nullyes
changesobject[]yes
changes[].changestringyes
changes[].subjectstringyes
changes[].namestringyes
changes[].lineinteger | nullyes
changes[].detailstringyes
warningsDiagnostic[]yes
warnings[].code"E100" | "E101" | "E110" | "E111" | "E120" | "E121" | "E123" | "E124" | "E125" | "E130" | "E131" | "E132" | "E133" | "E134" | "E135" | "E136" | "E137" | "E138" | "E139" | "E140" | "W200" | "W201" | "W202" | "W203" | "W204" | "W205" | "W206" | "W207" | "W208" | "W500" | "W600" | "W601" | "W700" | "W701" | "W702" | "W703" | "W704" | "W705" | "W706" | "W707" | "W708" | "W709" | "W710" | "M100" | "M101" | "M102" | "M103" | "M104" | "M110" | "M200" | "M201" | "M202" | "M203" | "M204" | "M205" | "M206" | "M207" | "M208" | "M209" | "M210" | "M211" | "M212" | "M213" | "M214" | "M215" | "M216" | "M217" | "M218" | "E300" | "E301" | "E302" | "E303" | "E304" | "W300" | "W301" | "W302" | "W303" | "M120" | "M220" | "M221" | "M222" | "E340" | "E341" | "E342" | "E343" | "E344" | "E345" | "W320" | "W321" | "W322" | "W323" | "M240" | "M241" | "M242" | "E360" | "E361" | "E362" | "E363" | "E364" | "E365" | "E366" | "E367" | "W330" | "W331" | "W332" | "W333" | "W334" | "M250" | "M251" | "E400" | "E401" | "E402" | "E403" | "W350" | "W351" | "W352" | "W353" | "M270" | "M271" | "E420" | "E421" | "E422" | "E423" | "E424" | "W360" | "W361" | "W362" | "W363" | "W364" | "M180" | "M280" | "M281" | "M282" | "E320" | "E321" | "E322" | "E323" | "E324" | "E325" | "E326" | "E327" | "E328" | "E329" | "E330" | "W310" | "W311" | "W312" | "W313" | "W314" | "M130" | "M131" | "M132" | "M230" | "M231" | "M232" | "M233" | "M234" | "M235" | "M236" | "M237" | "M238" | "E380" | "E381" | "E382" | "E383" | "W340" | "W341" | "W342" | "W343" | "M260" | "I100" | "I101" | "I102" | "I103" | "I104" | "I105" | "I200" | "I201" | "I202" | "I203" | "I204" | "I206" | "R100" | "R101" | "R200" | "R201" | "R202" | "R203" | "R204" | "R205" | "R206" | "R207" | "S100" | "S200" | "S101" | "S102" | "S103" | "S104" | "S201" | "S202" | "S203" | "S204"yesStable code to branch on; E-codes are errors, W-codes are warnings.
warnings[].severity"error" | "warning"yesErrors stop rendering; warnings never do.
warnings[].messagestringyesWhat is wrong, in one sentence.
warnings[].lineintegeryes1-based line in the submitted source. minimum 1.
warnings[].columnintegeryes1-based column in that line. minimum 1.
warnings[].lengthintegeryesNumber of characters the problem covers. minimum 1.
warnings[].hintstring | nullyesA concrete suggestion for fixing it, or null.
secretsobjectyes
secrets.countintegeryes
secrets.kindsstring[]yes

See also

DocWhy
API referenceEvery endpoint, and the error envelope
SchemasEvery request and response type
Tool referenceThe operations as callable tools