Skip to content
Connect an agent

Organisations

Combine a series into one diagram

Merges the flow parts of a series into one diagram, each part a group and the arrows between parts whole again, and publishes it as the series' place 0 in the folder of its first part.

POST/orgs/{org}/diagrams/series/{seriesId}/combine

TL;DR

QuestionAnswer
What does it do?Combine a series into one diagram.
What does it take?org, seriesId in the path.
What does it return?Status 201 with a body of type CombinedOrganisationSeries.
What can go wrong?400 the series id is not letters, digits, - and _; 401 not signed in, or the key is not valid; 403 a reader may not publish (orgs.forbidden), a folder rule forbids it (orgs.folder_restricted, details.reason kept_inside or leaves_rule), or the plan has no room (hosting.quota_exceeded); 404 no such organisation or series, the caller is not a member, or the key belongs to another organisation; 413 the combined diagram is larger than the plan hosts; 422 a part carries no source or is not a flow (diagram.series_not_combinable, details.parts), or the combined diagram has errors; 429 too many requests, or the daily limit is used up; 503 organisations are not set up on this server, or the engine is unavailable. Every failure uses the one error envelope.

What it does

Merges the flow parts of a series into one diagram, each part a group and the arrows between parts whole again, and publishes it as the series' place 0 in the folder of its first part. Each part must carry its source. The rights, folder rules, plan, and approval of a publish apply.

Path parameters

FieldTypeRequiredDescription
orgstringyesThe organisation's id or its slug.
seriesIdstringyesThe series id the parts were published with.

Responses

StatusMeaningBody
201The combined diagram and what went into it.CombinedOrganisationSeries
400The series id is not letters, digits, - and _.ErrorResponse
401Not signed in, or the key is not valid.ErrorResponse
403A reader may not publish (orgs.forbidden), a folder rule forbids it (orgs.folder_restricted, details.reason kept_inside or leaves_rule), or the plan has no room (hosting.quota_exceeded).ErrorResponse
404No such organisation or series, the caller is not a member, or the key belongs to another organisation.ErrorResponse
413The combined diagram is larger than the plan hosts.ErrorResponse
422A part carries no source or is not a flow (diagram.series_not_combinable, details.parts), or the combined diagram has errors.ErrorResponse
429Too many requests, or the daily limit is used up.ErrorResponse
503Organisations are not set up on this server, or the engine is unavailable.ErrorResponse

Response body

A 201 answer has the type CombinedOrganisationSeries.

FieldTypeRequiredDescription
diagramPublishedOrganisationDiagramyes
diagram.idstringyesThe handle for the diagram in the routes below.
diagram.namestring | nullyesThe label given at publish, or null.
diagram.folderstring | nullyesThe folder it is filed in, such as Payments/Checkout, or null for the top level.
diagram.scheme"light" | "dark" | "auto"yesThe color scheme it was drawn in: light, dark, or auto.
diagram.bytesintegeryesSize of the stored SVG in bytes.
diagram.createdBystring | nullyesThe person it belongs to: the member who published it, or the person who connected the agent that did. Null when that account has left or an organisation key published it.
diagram.publishedVia"person" | "connection" | "key" | nullyesHow it was published: person (signed in, or with a key the person made), connection (an agent connected to the organisation, whose person is createdBy), or key (an organisation key from Keys and CI). Null for a diagram published before this was recorded.
diagram.publishedKeyobject | nullyesThe key behind a connection or an organisation key. Null for a person, and once the key no longer exists.
diagram.publishedKey.idstringyesThe key's id, as Keys and CI lists it. Never the key itself.
diagram.publishedKey.namestring | nullyesThe key's name, or null once the key is revoked.
diagram.publishedClientstring | nullyesThe client name the agent gave when it connected, such as Claude Code, for a connection only. at most 100 characters.
diagram.createdAtintegeryesWhen it was first published, in milliseconds since the epoch.
diagram.publishedAtintegeryesWhen it was last published, in milliseconds since the epoch. Publishing the same diagram again moves it.
diagram.expiresAtinteger | nullyesWhen it will be deleted, in milliseconds since the epoch, or null when the owner's plan keeps diagrams until they are deleted.
diagram.viewUrlstringyesA page in the portal that shows the diagram to a signed-in member. It is not a link anyone can open: an organisation's diagrams have no public address.
diagram.lockedbooleanyesTrue while the owner has the diagram locked: nobody can delete, rename or move it, its publisher and the owner included, until the owner unlocks it. A lock does not stop it expiring on a plan that expires diagrams.
diagram.lockedAtinteger | nullyesWhen the owner locked it, in milliseconds since the epoch, or null when it is not locked.
diagram.restrictedtruenoPresent, and true, when the owner has restricted this diagram's folder and the caller is allowed in it, so the portal can show it as locked. Absent otherwise. A diagram in a folder the caller may not use is not listed at all.
diagram.keepInsidetruenoPresent, and true, when the folder rule over this diagram keeps its diagrams inside: the svg route refuses ?download=1 and the copy route refuses a copy (403 orgs.folder_restricted). Absent otherwise.
diagram.shareOrganisationDiagramShareyesIts public link while the organisation shares it, or null. Only a diagram someone chose to share has one.
diagram.share.urlstringyesThe public address, {CDN_URL}/l/<token>.svg. Anyone with it can see the picture, without its source. It keeps showing the latest version when the diagram is edited, and never changes.
diagram.share.sharedAtintegeryesWhen the diagram was first shared, in milliseconds since the epoch.
diagram.keptbooleanyes"Keep": true when an owner or admin keeps it from the library retention. The plan's own retention still applies.
diagram.deletesAtinteger | nullyesWhen the retention deletes it, in milliseconds since the epoch: the nearer of the plan's expiry and "Delete library diagrams not updated for". Null when nothing will, and always null under a legal hold.
diagram.classificationClassificationyesA diagram's classification label: public, internal (the default, and what a diagram published before labels reads as) or confidential. Confidential is never shared publicly; under "Share only diagrams labelled Public" only public is.
diagram.pendingbooleanyesTrue while it is held for approval ("Publishing needs approval"): only its publisher and the approvers see it.
diagram.changePendingbooleanyesTrue while a new version of it waits for approval. The library shows this version until then.
diagram.seriesDiagramSeriesyesIts place in a series (the parts of one split import), or null when it is in none.
diagram.series.idstringyesThe series id the parts were published with.
diagram.series.indexintegeryesIts place in the series, from 1; 0 is the whole import combined into one diagram.
diagram.series.totalinteger | nullyesHow many parts the publisher said the series has, or null.
diagram.createdbooleanyesTrue when this call stored a new diagram; false when the same diagram was already in the library and was kept.
diagram.sourceEmbeddedbooleanyesTrue when the stored picture carries the diagram source: the call sent embedSource true, or left it out while the organisation's keepEditable is on.
diagram.approvalApprovalHoldnoPresent when the organisation's "Publishing needs approval" or "Public sharing needs approval" held this. It is data, not an error: the diagram is stored, and only its publisher and the approvers can see it until an approver approves.
diagram.approval.state"pending"yes
diagram.approval.requestIdstringyesThe request, as the Approvals queue lists it.
diagram.approval.kind"publish" | "change" | "share"yespublish (a new diagram), change (a new version of one the library shows) or share (a public link).
diagram.approval.expiresAtintegeryesWhen the daily sweep ends the request if nobody decides it, in milliseconds since the epoch: thirty days after it was made.
diagram.approval.messagestringyesOne sentence to tell the person: held for approval by the organisation, and what happens next.
diagram.approval.codestringyesThe warning code a tool answer carries for it: W601.
mergedinteger[]yesThe places of the parts merged, in order.
skippedobject[]yesThe parts left out on purpose.
skipped[].indexintegeryes
skipped[].namestringyes
skipped[].reason"overview" | "combined"yesoverview: a split's overview, whose boxes stand for parts. combined: an earlier combined whole, which this one takes the place of.
linksobjectyesThe arrows between parts.
links.restoredintegeryesArrows a part drew to a dashed box of another part, now ending on the box itself.
links.keptintegeryesArrows that still end on a dashed box naming another part, because that part is not in the series.
notestringyesOne sentence for the person: what was merged and how the arrows between parts were drawn.

See also

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