{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Order management patterns","description":"Find answers to your technical questions and learn how to integrate Mirakl products.","lang":"en-US","siteUrl":"https://developer.mirakl.com","keywords":"mirakl, documentation, api"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"order-management-patterns","__idx":0},"children":["Order management patterns"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Order management spans two flows:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["how to synchronize the orders and the returns into Mirakl Connect,"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["how to carry out the actions Mirakl Connect requests."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This page collects the patterns that mature connectors converge on across both flows, and the anti-patterns that recur."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"recommended-patterns","__idx":1},"children":["Recommended patterns"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"restate-the-whole-object-and-let-the-newest-version-win","__idx":2},"children":["Restate the whole object, and let the newest version win"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What to do."]}," ","Treat every ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/rest/connect/openapi3/orders/upsertorders"},"children":["upsertOrders"]}," call and every ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/rest/connect/openapi3/returns/upsertreturns"},"children":["upsertReturns"]}," call as a complete restatement of the object, never as a patch."," ","Build the order or the return from the channel's current truth, with all its lines, its full adjustment history, and its current status, and send that entire state each time."," ","Stamp your outgoing object with the channel's own last-modified time, in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["channel_updated_at"]},"."," ","Resolve any collision between two versions of the same object, and keep the one that carries the later timestamp."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it works."]}," ","The contract offers no PATCH."," ","A field or a line you leave out is not unchanged, it is gone, and an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["adjustments"]}," list that carries only the newest entry erases the ones before it."," ","To restate the whole object removes that risk by construction, because there is nothing to omit."," ","Connect versions the updates on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["channel_updated_at"]}," and silently drops any update older than the value it holds, so a redelivered or late message cannot overwrite a current order with a stale one."," ","When you align your own conflict resolution to the same newest-wins rule, the two layers agree."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["In practice."]}," ","A connector holds the order's current state, keyed by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["channel_order_id"]},"."," ","It folds each observed change from the channel into that state, and emits the complete object."," ","The append-only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["adjustments"]}," list grows, but the connector always sends it in full."," ","Deduplicate the events you consume by their envelope ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},", a ULID, so that a repeat delivery does no work twice."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/orders/sync-orders-into-connect"},"children":["Sync orders into Connect"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"run-the-action-loop-as-a-durable-idempotent-state-machine","__idx":3},"children":["Run the action loop as a durable, idempotent state machine"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What to do."]}," ","Give each ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/webhooks/webhook/webhooks/orderactionevent"},"children":["OrderActionEvent"]}," a stored lifecycle of its own:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["On receipt, persist the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action_id"]}," and what the action asks for."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Perform the action on the channel, in a way that is safe to repeat."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Report the terminal outcome, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SUCCESS"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FAILED"]},", through ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/rest/connect/openapi3/orders/updateactionstatus"},"children":["updateActionStatus"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["exactly once"]},", when the action is genuinely complete."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Treat an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ACTION_ALREADY_FINAL"]}," response as a confirmation that the outcome was already recorded, not as an error to retry."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it works."]}," ","Actions are asynchronous: Mirakl Connect gives you an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action_id"]},", then waits for an outcome that can take a call to the channel to produce."," ","An action whose outcome you never report stays open, and Mirakl Connect still expects an answer."," ","A duplicate delivery that runs the channel operation twice ships twice or refunds twice."," ","A stored lifecycle makes a missing outcome a condition you can see and retry, and it makes repeated deliveries apply once."," ","To report only once the action is complete keeps you from acknowledging work the channel has not finished."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["In practice."]}," ","When the event arrives, write a pending record against the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action_id"]},"."," ","Execute against the channel, guarded so that a repeat is a no-op."," ","On completion, call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updateActionStatus"]}," and mark the record final."," ","If that call returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ACTION_ALREADY_FINAL"]},", the record is simply already closed."," ","After an action that changes the state, follow it with an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertOrders"]}," or an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertReturns"]}," that reports the resulting status."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/orders/handle-order-action-events"},"children":["Handle order action events"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"translate-every-channel-failure-into-a-precise-actionerror-code","__idx":4},"children":["Translate every channel failure into a precise ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ActionError"]}," code"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What to do."]}," ","When you cannot carry an action out, map the channel's refusal onto the bounded ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ActionError"]}," code that names it, such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ORDER_IN_WRONG_STATE"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CARRIER_NOT_SUPPORTED"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MISSING_CARRIER"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WAREHOUSE_ID_REQUIRED"]},"."," ","Put the specifics in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]},", which a human reads."," ","Reserve ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTHER"]}," for the failures that genuinely fit none of the named codes."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it works."]}," ","The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["code"]}," is the machine-readable contract that Mirakl Connect and the seller act on."," ","The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]}," is explicitly subject to change, and nothing must parse it."," ","A precise code turns a failed action into something Mirakl Connect can act on and the seller can fix."," ","To collapse every failure into ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTHER"]}," loses that information."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["In practice."]}," ","Keep a mapping from the channel's error vocabulary to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ActionError"]}," enum."," ","Report the closest code, with a message that quotes the channel's own reason."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/orders/handle-order-action-events#4-report-the-outcome"},"children":["Handle order action events"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"reconcile-returns-against-the-per-return-response","__idx":5},"children":["Reconcile returns against the per-return response"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What to do."]}," ","Read the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]}," from ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/rest/connect/openapi3/returns/upsertreturns"},"children":["upsertReturns"]}," as a report, not as a receipt."," ","Walk ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_success"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_errors"]},", record which returns Connect applied, and drive only the failed ones again."," ","First, make sure that you synchronized the order and the order lines that each return references."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it works."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertReturns"]}," is partially successful: a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]}," means that the request was well-formed, not that Connect applied every return in it."," ","A return whose order or order lines Connect has not seen yet fails inside a response that is otherwise successful."," ","To treat the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]}," as total success silently drops those failures, and the returns then never appear in Connect."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["In practice."]}," ","Synchronize the order with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertOrders"]}," before its returns."," ","Submit the returns in batches."," ","On the response, retry the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_errors"]}," entries, and fix the referenced ids where the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["field"]}," points at them."," ","Leave the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_success"]}," entries alone."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/returns"},"children":["Returns"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"anti-patterns","__idx":6},"children":["Anti-patterns"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"upserting-deltas-instead-of-the-whole-object","__idx":7},"children":["Upserting deltas instead of the whole object"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What it looks like:"]}," the connector sends only what changed, such as the one line that shipped or the single new adjustment, and expects Connect to merge it into the order it already holds."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it fails:"]}," there is no merge."," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertOrders"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertReturns"]}," replace the object wholesale, so Connect drops every line and every adjustment that is absent from the payload, instead of preserving them."," ","A partial adjustment list rewrites the refund and cancellation history of the line down to the one entry you sent."," ","A missing line disappears from the order."," ","The connector believes that it made a small update, and it has instead erased everything it did not restate."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Do this instead:"]}," build and send the complete object every time, with all the lines, the full append-only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["adjustments"]}," history, and the current status."," ","There is then nothing to merge and nothing to omit."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#restate-the-whole-object-and-let-the-newest-version-win"},"children":["Restate the whole object"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"reporting-an-action-once-and-forgetting-it-or-losing-the-action_id","__idx":8},"children":["Reporting an action once and forgetting it, or losing the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action_id"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What it looks like:"]}," the connector performs the channel operation, and then it either never calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updateActionStatus"]},", or it fires the call optimistically without tracking the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action_id"]},"."," ","It then cannot report ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FAILED"]}," when the channel later refuses, and it cannot tell whether it already answered."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it fails:"]}," an action with no reported outcome stays open, because Mirakl Connect holds it and waits."," ","An outcome reported against a lost or wrong ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action_id"]}," never reaches the action it was meant for."," ","And without a record of what it already answered, a repeat delivery drives the channel operation a second time, which is a second shipment or a second refund."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Do this instead:"]}," persist the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action_id"]}," the moment the event arrives, tie the channel operation and its outcome to that record, and report the terminal status exactly once."," ","An ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ACTION_ALREADY_FINAL"]}," response confirms that the outcome was already recorded, so treat it as a success, not as a failure to retry."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#run-the-action-loop-as-a-durable-idempotent-state-machine"},"children":["Run the action loop as a durable, idempotent state machine"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"acknowledging-an-action-without-re-syncing-the-state-it-produced","__idx":9},"children":["Acknowledging an action without re-syncing the state it produced"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What it looks like:"]}," the connector reports ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SUCCESS"]}," on an action, such as an accept, a shipment, or a cancellation, and stops there."," ","It never pushes the order's resulting status back to Connect."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it fails:"]}," the outcome of the action and the state of the order are two separate reports."," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updateActionStatus"]}," tells Mirakl Connect that the action finished, and it does not carry the order's new status."," ","An order that was just shipped still reads as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AWAITING_SHIPMENT"]}," in Connect until an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertOrders"]}," says otherwise."," ","The copy in Connect then drifts from the channel, and every view of the order downstream is wrong."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Do this instead:"]}," treat an action that changes the state as two steps."," ","Report the outcome with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updateActionStatus"]},", then report the new state with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertOrders"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertReturns"]},"."," ","The order has not finished moving until you have sent both."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#run-the-action-loop-as-a-durable-idempotent-state-machine"},"children":["Run the action loop as a durable, idempotent state machine"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"reading-a-returns-200-as-total-success","__idx":10},"children":["Reading a returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]}," as total success"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What it looks like:"]}," the connector submits a batch of returns, sees a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]},", and moves on."," ","It treats the status code as a confirmation that Connect applied every return."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why it fails:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upsertReturns"]}," is partially successful."," ","The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]}," reports only that the request was syntactically valid, and individual returns inside it can still fail, most often because nobody synchronized their order or their order lines."," ","Those failures live in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_errors"]},", not in the HTTP status."," ","A connector that never reads them never learns that the returns are absent from Connect."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Do this instead:"]}," inspect ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_success"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["return_errors"]}," on every response, synchronize each return's order first, and drive only the failed returns again."," ","Read ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#reconcile-returns-against-the-per-return-response"},"children":["Reconcile returns against the per-return response"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related-pages","__idx":11},"children":["Related pages"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/orders/sync-orders-into-connect"},"children":["Sync orders into Connect"]},": the upsert flow the restatement pattern applies to."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/orders/handle-order-action-events"},"children":["Handle order action events"]},": the action loop the state machine pattern applies to."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/returns"},"children":["Returns"]},": the return upserts and the return actions these patterns apply to."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/content/product/connect-channel-platform/developer-guide/best-practices"},"children":["Best practices"]},": the same rules on idempotency, ordering, and errors, stated for every domain."]}]}]},"headings":[{"value":"Order management patterns","id":"order-management-patterns","depth":1},{"value":"Recommended patterns","id":"recommended-patterns","depth":2},{"value":"Restate the whole object, and let the newest version win","id":"restate-the-whole-object-and-let-the-newest-version-win","depth":3},{"value":"Run the action loop as a durable, idempotent state machine","id":"run-the-action-loop-as-a-durable-idempotent-state-machine","depth":3},{"value":"Translate every channel failure into a precise ActionError code","id":"translate-every-channel-failure-into-a-precise-actionerror-code","depth":3},{"value":"Reconcile returns against the per-return response","id":"reconcile-returns-against-the-per-return-response","depth":3},{"value":"Anti-patterns","id":"anti-patterns","depth":2},{"value":"Upserting deltas instead of the whole object","id":"upserting-deltas-instead-of-the-whole-object","depth":3},{"value":"Reporting an action once and forgetting it, or losing the action_id","id":"reporting-an-action-once-and-forgetting-it-or-losing-the-action_id","depth":3},{"value":"Acknowledging an action without re-syncing the state it produced","id":"acknowledging-an-action-without-re-syncing-the-state-it-produced","depth":3},{"value":"Reading a returns 200 as total success","id":"reading-a-returns-200-as-total-success","depth":3},{"value":"Related pages","id":"related-pages","depth":2}],"frontmatter":{"seo":{"title":"Order management patterns"}},"lastModified":"2026-11-06T15:01:50.980Z","pagePropGetterError":{"message":"","name":""}},"slug":"/content/product/connect-channel-platform/developer-guide/orders/patterns","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}