{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["partial","admonition","tabs","tab","code-snippet"]},"type":"markdown"},"seo":{"title":"Enroll employees and dependents, and request ID cards"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"enroll-employees-and-dependents-and-request-id-cards","__idx":0},"children":["Enroll employees and dependents, and request ID cards"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This playbook is for HR and benefits integrators and enrollment teams who load new hires or a census into VBASoftware. At the end, each family is a subscriber with members, enrolled in a group contract and plan, with an ID card request on file."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":""},"children":[]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":""},"children":[]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Who this is for"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["HR and benefits integrators, enrollment and implementation teams"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Time to run"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["About 20 minutes for one family; the census variation takes longer for a large file"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Writes data"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes. Try it in a non-production database first if you have one."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Operations used"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["12 in the main flow, plus 2 batch operations for a census: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/group-contracts/listgroupcontract"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /groups/{groupID}/divisions/{divisionID}/contracts"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/group-contract-plans/listgroupcontractplan"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /groups/{groupID}/divisions/{divisionID}/contracts/{coverageStart}/plans"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/relationships/listrelationships"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /relationships"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/createsubscribers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/members/createmembers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers/{subscriberID}/members"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/adv.-enrollment/subscriberaddenrollment"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers/{subscriberID}/add-enrollment"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscriber-enrollments/listsubenrollment"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}/enrollments"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscriber-enrollment-plans/createsubenrollmentplan"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers/{subscriberID}/enrollments/{groupID}/{divisionID}/{groupCoverageStart}/{startDate}/plans"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscriber-enrollment-plans/listsubenrollmentplan"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}/enrollments/{groupID}/{divisionID}/{groupCoverageStart}/{startDate}/plans"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-id-card-request-types/listidcardrequesttype"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /id-card-request-types"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-id-card-requests/createidcardrequest"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /id-card-requests"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-id-card-requests/getidcardrequest"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /id-card-requests/{iDCardRequestKey}"]}]},"; census: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/updatebatchsubscribers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /subscribers-batch"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/members/updatebatchmembers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /subscribers/{subscriberID}/members-batch"]}]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"This changes production data"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["VBAPI clients connect to production, so the write calls on this page create or change real records in the database you name in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["vbasoftware-database"]},". Try the steps in a non-production database first if VBA has given you one, use clearly fake values while you test, and keep the \"Check it worked\" calls, which only read data. \"Try it\" in the API reference also calls production."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Before you start"},"children":[{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You have finished the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/get-started/quick-start"},"children":["quick start"]}," and can get an ID token. The samples read your credentials from environment variables; see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#set-up-your-environment"},"children":["Set up your environment"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The employer's group and division exist, with at least one contract and a plan on it. The samples use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DOCS-GRP1"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DOCS-DIV1"]}," from ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/playbooks/onboard-employer-group"},"children":["Onboard a new employer group"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The API user can create subscribers, members, and enrollments, and create ID card requests."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You have read the subscribers, members, and enrollments part of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/concepts/data-model"},"children":["data model"]},"."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-fits-together","__idx":1},"children":["How it fits together"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["subscriber"]}," is the family unit, identified by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Members"]}," are the people in it, identified by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]}," plus a two-character ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["member_Seq"]},". One member is the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["insured"]}," (the employee). The family's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["enrollment"]}," ties the subscriber to a group contract for a date range, and enrollment ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["plans"]}," say which plan they are covered by."]},{"$$mdtype":"Tag","name":"Diagram","attributes":{"data-language":"mermaid","diagramType":"mermaid","diagramSource":"sequenceDiagram\n  participant App as Your system\n  participant API as VBAPI\n  App->>API: GET contracts and plans, GET /relationships\n  API-->>App: coverage dates, plan_ID, relationship codes\n  App->>API: POST /subscribers\n  API-->>App: 200 subscriber\n  App->>API: POST /subscribers/{id}/members (insured, then dependents)\n  API-->>App: 200 member with member_Seq\n  App->>API: POST /subscribers/{id}/add-enrollment\n  API-->>App: 202 Accepted, no body\n  App->>API: GET /subscribers/{id}/enrollments\n  API-->>App: the new enrollment\n  App->>API: POST .../enrollments/.../plans\n  API-->>App: 200 enrollment plan\n  App->>API: POST /id-card-requests\n  API-->>App: 200 with idCardRequest_Key\n","diagramHtml":"<svg id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" style=\"max-width: 748px;\" viewBox=\"-50 -10 748 809\" role=\"graphics-document document\" aria-roledescription=\"sequence\"><style>\n    #diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c foreignObject {\n      overflow: visible;\n    }\n  </style><g><rect x=\"498\" y=\"723\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"API\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"573\" y=\"755.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"573\" dy=\"0\">VBAPI</tspan></text></g><g><rect x=\"0\" y=\"723\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"App\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"75\" y=\"755.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">Your system</tspan></text></g><g><line id=\"actor1\" x1=\"573\" y1=\"65\" x2=\"573\" y2=\"723\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"API\" data-et=\"life-line\" data-id=\"API\"></line><g id=\"root-1\" data-et=\"participant\" data-type=\"participant\" data-id=\"API\"><rect x=\"498\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"API\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"573\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"573\" dy=\"0\">VBAPI</tspan></text></g></g><g><line id=\"actor0\" x1=\"75\" y1=\"65\" x2=\"75\" y2=\"723\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"App\" data-et=\"life-line\" data-id=\"App\"></line><g id=\"root-0\" data-et=\"participant\" data-type=\"participant\" data-id=\"App\"><rect x=\"0\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"App\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"75\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">Your system</tspan></text></g></g><style>#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .error-icon{fill:#552222;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .error-text{fill:#552222;stroke:#552222;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-thickness-normal{stroke-width:1px;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-thickness-thick{stroke-width:3.5px;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-pattern-solid{stroke-dasharray:0;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-pattern-dashed{stroke-dasharray:3;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .edge-pattern-dotted{stroke-dasharray:2;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .marker{fill:#333333;stroke:#333333;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .marker.cross{stroke:#333333;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c p{margin:0;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .actor{stroke:#9370DB;fill:#ECECFF;stroke-width:1;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c rect.actor.outer-path[data-look=\"neo\"]{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c rect.note[data-look=\"neo\"]{stroke:#aaaa33;fill:#fff5ad;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c text.actor&gt;tspan{fill:black;stroke:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .actor-line{stroke:#9370DB;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .innerArc{stroke-width:1.5;stroke-dasharray:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [id$=\"-arrowhead\"] path{fill:#333;stroke:#333;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .sequenceNumber{fill:white;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [id$=\"-sequencenumber\"]{fill:#333;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [id$=\"-crosshead\"] path{fill:#333;stroke:#333;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .messageText{fill:#333;stroke:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .labelBox{stroke:#9370DB;fill:#ECECFF;filter:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .labelText,#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .labelText&gt;tspan{fill:black;stroke:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .loopText,#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .loopText&gt;tspan{fill:black;stroke:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .sectionTitle,#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .sectionTitle&gt;tspan{fill:black;stroke:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:#9370DB;fill:#9370DB;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .note{stroke:#aaaa33;fill:#fff5ad;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .noteText,#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .noteText&gt;tspan{fill:black;stroke:none;font-weight:normal;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .activation0{fill:#f4f4f4;stroke:#666;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .activation1{fill:#f4f4f4;stroke:#666;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .activation2{fill:#f4f4f4;stroke:#666;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .actorPopupMenu{position:absolute;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .actor-man circle,#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c line{fill:#ECECFF;stroke-width:2px;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c g rect.rect{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));stroke:#9370DB;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c .node .neo-node{stroke:#9370DB;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].node rect,#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].cluster rect,#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g></g><defs><symbol id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-computer\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z\"></path></symbol></defs><defs><symbol id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-database\" fill-rule=\"evenodd\" clip-rule=\"evenodd\"><path transform=\"scale(.5)\" d=\"M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z\"></path></symbol></defs><defs><symbol id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-clock\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z\"></path></symbol></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead\" refX=\"7.9\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M -1 0 L 10 5 L 0 10 z\"></path></marker></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-crosshead\" markerWidth=\"15\" markerHeight=\"8\" orient=\"auto\" refX=\"4\" refY=\"4.5\"><path fill=\"none\" stroke=\"#000000\" stroke-width=\"1pt\" d=\"M 1,2 L 6,7 M 6,2 L 1,7\" style=\"stroke-dasharray: 0, 0;\"></path></marker></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-filled-head\" refX=\"15.5\" refY=\"7\" markerWidth=\"20\" markerHeight=\"28\" orient=\"auto\"><path d=\"M 18,7 L9,13 L14,7 L9,1 Z\"></path></marker></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-sequencenumber\" refX=\"15\" refY=\"15\" markerWidth=\"60\" markerHeight=\"40\" orient=\"auto\"><circle cx=\"15\" cy=\"15\" r=\"6\"></circle></marker></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-solidTopArrowHead\" refX=\"7.9\" refY=\"7.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 8 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-solidBottomArrowHead\" refX=\"7.9\" refY=\"0.75\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 0 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-stickTopArrowHead\" refX=\"7.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 7 7\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><defs><marker id=\"diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-stickBottomArrowHead\" refX=\"7.5\" refY=\"0\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 7 L 7 0\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><text x=\"323\" y=\"80\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">GET contracts and plans, GET /relationships</text><line x1=\"76\" y1=\"111\" x2=\"569\" y2=\"111\" class=\"messageLine0\" data-et=\"message\" data-id=\"i0\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"126\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">coverage dates, plan_ID, relationship codes</text><line x1=\"572\" y1=\"157\" x2=\"79\" y2=\"157\" class=\"messageLine1\" data-et=\"message\" data-id=\"i1\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"172\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /subscribers</text><line x1=\"76\" y1=\"201\" x2=\"569\" y2=\"201\" class=\"messageLine0\" data-et=\"message\" data-id=\"i2\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"216\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 subscriber</text><line x1=\"572\" y1=\"245\" x2=\"79\" y2=\"245\" class=\"messageLine1\" data-et=\"message\" data-id=\"i3\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"260\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /subscribers/{id}/members (insured, then dependents)</text><line x1=\"76\" y1=\"291\" x2=\"569\" y2=\"291\" class=\"messageLine0\" data-et=\"message\" data-id=\"i4\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"306\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 member with member_Seq</text><line x1=\"572\" y1=\"337\" x2=\"79\" y2=\"337\" class=\"messageLine1\" data-et=\"message\" data-id=\"i5\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"352\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /subscribers/{id}/add-enrollment</text><line x1=\"76\" y1=\"383\" x2=\"569\" y2=\"383\" class=\"messageLine0\" data-et=\"message\" data-id=\"i6\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"398\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">202 Accepted, no body</text><line x1=\"572\" y1=\"429\" x2=\"79\" y2=\"429\" class=\"messageLine1\" data-et=\"message\" data-id=\"i7\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"444\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">GET /subscribers/{id}/enrollments</text><line x1=\"76\" y1=\"475\" x2=\"569\" y2=\"475\" class=\"messageLine0\" data-et=\"message\" data-id=\"i8\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"490\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">the new enrollment</text><line x1=\"572\" y1=\"519\" x2=\"79\" y2=\"519\" class=\"messageLine1\" data-et=\"message\" data-id=\"i9\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"534\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST .../enrollments/.../plans</text><line x1=\"76\" y1=\"565\" x2=\"569\" y2=\"565\" class=\"messageLine0\" data-et=\"message\" data-id=\"i10\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"580\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 enrollment plan</text><line x1=\"572\" y1=\"611\" x2=\"79\" y2=\"611\" class=\"messageLine1\" data-et=\"message\" data-id=\"i11\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"626\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /id-card-requests</text><line x1=\"76\" y1=\"657\" x2=\"569\" y2=\"657\" class=\"messageLine0\" data-et=\"message\" data-id=\"i12\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"672\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 with idCardRequest_Key</text><line x1=\"572\" y1=\"703\" x2=\"79\" y2=\"703\" class=\"messageLine1\" data-et=\"message\" data-id=\"i13\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-2587d07516a6161c11f5162cafa6a04102dc0f4ad40b8d951127de3baf37611c-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line></svg>","diagramHtmlDark":"<svg id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" style=\"max-width: 748px;\" viewBox=\"-50 -10 748 809\" role=\"graphics-document document\" aria-roledescription=\"sequence\"><style>\n    #diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde foreignObject {\n      overflow: visible;\n    }\n  </style><g><rect x=\"498\" y=\"723\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"API\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"573\" y=\"755.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"573\" dy=\"0\">VBAPI</tspan></text></g><g><rect x=\"0\" y=\"723\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"App\" rx=\"3\" ry=\"3\" class=\"actor actor-bottom\"></rect><text x=\"75\" y=\"755.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">Your system</tspan></text></g><g><line id=\"actor1\" x1=\"573\" y1=\"65\" x2=\"573\" y2=\"723\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"API\" data-et=\"life-line\" data-id=\"API\"></line><g id=\"root-1\" data-et=\"participant\" data-type=\"participant\" data-id=\"API\"><rect x=\"498\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"API\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"573\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"573\" dy=\"0\">VBAPI</tspan></text></g></g><g><line id=\"actor0\" x1=\"75\" y1=\"65\" x2=\"75\" y2=\"723\" class=\"actor-line 200\" stroke-width=\"0.5px\" stroke=\"#999\" name=\"App\" data-et=\"life-line\" data-id=\"App\"></line><g id=\"root-0\" data-et=\"participant\" data-type=\"participant\" data-id=\"App\"><rect x=\"0\" y=\"0\" fill=\"#eaeaea\" stroke=\"#666\" width=\"150\" height=\"65\" name=\"App\" rx=\"3\" ry=\"3\" class=\"actor actor-top\"></rect><text x=\"75\" y=\"32.5\" dominant-baseline=\"central\" alignment-baseline=\"central\" class=\"actor actor-box\" style=\"text-anchor: middle; font-size: 16px; font-weight: 400; font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif;\"><tspan x=\"75\" dy=\"0\">Your system</tspan></text></g></g><style>#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .error-icon{fill:#a44141;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .error-text{fill:#ddd;stroke:#ddd;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-thickness-normal{stroke-width:1px;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-thickness-thick{stroke-width:3.5px;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-pattern-solid{stroke-dasharray:0;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-pattern-dashed{stroke-dasharray:3;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .edge-pattern-dotted{stroke-dasharray:2;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .marker{fill:lightgrey;stroke:lightgrey;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .marker.cross{stroke:lightgrey;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde p{margin:0;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .actor{stroke:#ccc;fill:#1f2020;stroke-width:1;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde rect.actor.outer-path[data-look=\"neo\"]{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde rect.note[data-look=\"neo\"]{stroke:hsl(180, 0%, 18.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde text.actor&gt;tspan{fill:lightgrey;stroke:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .actor-line{stroke:#ccc;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .innerArc{stroke-width:1.5;stroke-dasharray:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:lightgrey;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:lightgrey;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [id$=\"-arrowhead\"] path{fill:lightgrey;stroke:lightgrey;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .sequenceNumber{fill:black;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [id$=\"-sequencenumber\"]{fill:lightgrey;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [id$=\"-crosshead\"] path{fill:lightgrey;stroke:lightgrey;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .messageText{fill:lightgrey;stroke:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .labelBox{stroke:#ccc;fill:#1f2020;filter:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .labelText,#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .labelText&gt;tspan{fill:lightgrey;stroke:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .loopText,#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .loopText&gt;tspan{fill:lightgrey;stroke:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .sectionTitle,#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .sectionTitle&gt;tspan{fill:lightgrey;stroke:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:#ccc;fill:#ccc;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .note{stroke:hsl(180, 0%, 18.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .noteText,#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .noteText&gt;tspan{fill:rgb(183.8476190475, 181.5523809523, 181.5523809523);stroke:none;font-weight:normal;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .activation0{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:#ccc;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .activation1{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:#ccc;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .activation2{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:#ccc;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .actorPopupMenu{position:absolute;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .actorPopupMenuPanel{position:absolute;fill:#1f2020;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .actor-man circle,#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde line{fill:#1f2020;stroke-width:2px;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde g rect.rect{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));stroke:#ccc;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde .node .neo-node{stroke:#ccc;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].node rect,#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].cluster rect,#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].node polygon{stroke:url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].node path{stroke:url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-gradient);stroke-width:1px;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].node .neo-line path{stroke:#ccc;filter:none;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].node circle{stroke:url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].icon-shape .icon{fill:url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde [data-look=\"neo\"].icon-shape .icon-neo path{stroke:url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g></g><defs><symbol id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-computer\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z\"></path></symbol></defs><defs><symbol id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-database\" fill-rule=\"evenodd\" clip-rule=\"evenodd\"><path transform=\"scale(.5)\" d=\"M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z\"></path></symbol></defs><defs><symbol id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-clock\" width=\"24\" height=\"24\"><path transform=\"scale(.5)\" d=\"M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z\"></path></symbol></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead\" refX=\"7.9\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M -1 0 L 10 5 L 0 10 z\"></path></marker></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-crosshead\" markerWidth=\"15\" markerHeight=\"8\" orient=\"auto\" refX=\"4\" refY=\"4.5\"><path fill=\"none\" stroke=\"#000000\" stroke-width=\"1pt\" d=\"M 1,2 L 6,7 M 6,2 L 1,7\" style=\"stroke-dasharray: 0, 0;\"></path></marker></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-filled-head\" refX=\"15.5\" refY=\"7\" markerWidth=\"20\" markerHeight=\"28\" orient=\"auto\"><path d=\"M 18,7 L9,13 L14,7 L9,1 Z\"></path></marker></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-sequencenumber\" refX=\"15\" refY=\"15\" markerWidth=\"60\" markerHeight=\"40\" orient=\"auto\"><circle cx=\"15\" cy=\"15\" r=\"6\"></circle></marker></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-solidTopArrowHead\" refX=\"7.9\" refY=\"7.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 8 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-solidBottomArrowHead\" refX=\"7.9\" refY=\"0.75\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 0 L 0 8 z\"></path></marker></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-stickTopArrowHead\" refX=\"7.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 7 7\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><defs><marker id=\"diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-stickBottomArrowHead\" refX=\"7.5\" refY=\"0\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto-start-reverse\"><path d=\"M 0 7 L 7 0\" stroke=\"black\" stroke-width=\"1.5\" fill=\"none\"></path></marker></defs><text x=\"323\" y=\"80\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">GET contracts and plans, GET /relationships</text><line x1=\"76\" y1=\"111\" x2=\"569\" y2=\"111\" class=\"messageLine0\" data-et=\"message\" data-id=\"i0\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"126\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">coverage dates, plan_ID, relationship codes</text><line x1=\"572\" y1=\"157\" x2=\"79\" y2=\"157\" class=\"messageLine1\" data-et=\"message\" data-id=\"i1\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"172\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /subscribers</text><line x1=\"76\" y1=\"201\" x2=\"569\" y2=\"201\" class=\"messageLine0\" data-et=\"message\" data-id=\"i2\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"216\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 subscriber</text><line x1=\"572\" y1=\"245\" x2=\"79\" y2=\"245\" class=\"messageLine1\" data-et=\"message\" data-id=\"i3\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"260\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /subscribers/{id}/members (insured, then dependents)</text><line x1=\"76\" y1=\"291\" x2=\"569\" y2=\"291\" class=\"messageLine0\" data-et=\"message\" data-id=\"i4\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"306\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 member with member_Seq</text><line x1=\"572\" y1=\"337\" x2=\"79\" y2=\"337\" class=\"messageLine1\" data-et=\"message\" data-id=\"i5\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"352\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /subscribers/{id}/add-enrollment</text><line x1=\"76\" y1=\"383\" x2=\"569\" y2=\"383\" class=\"messageLine0\" data-et=\"message\" data-id=\"i6\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"398\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">202 Accepted, no body</text><line x1=\"572\" y1=\"429\" x2=\"79\" y2=\"429\" class=\"messageLine1\" data-et=\"message\" data-id=\"i7\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"444\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">GET /subscribers/{id}/enrollments</text><line x1=\"76\" y1=\"475\" x2=\"569\" y2=\"475\" class=\"messageLine0\" data-et=\"message\" data-id=\"i8\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"490\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">the new enrollment</text><line x1=\"572\" y1=\"519\" x2=\"79\" y2=\"519\" class=\"messageLine1\" data-et=\"message\" data-id=\"i9\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"534\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST .../enrollments/.../plans</text><line x1=\"76\" y1=\"565\" x2=\"569\" y2=\"565\" class=\"messageLine0\" data-et=\"message\" data-id=\"i10\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"580\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 enrollment plan</text><line x1=\"572\" y1=\"611\" x2=\"79\" y2=\"611\" class=\"messageLine1\" data-et=\"message\" data-id=\"i11\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line><text x=\"323\" y=\"626\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">POST /id-card-requests</text><line x1=\"76\" y1=\"657\" x2=\"569\" y2=\"657\" class=\"messageLine0\" data-et=\"message\" data-id=\"i12\" data-from=\"App\" data-to=\"API\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"fill: none;\"></line><text x=\"326\" y=\"672\" text-anchor=\"middle\" dominant-baseline=\"middle\" alignment-baseline=\"middle\" class=\"messageText\" dy=\"1em\" style=\"font-family: &quot;Redocly Mermaid Sans&quot;, Arial, &quot;Liberation Sans&quot;, Arimo, Helvetica, &quot;Redocly Mermaid CJK&quot;, sans-serif; font-size: 16px; font-weight: 400;\">200 with idCardRequest_Key</text><line x1=\"572\" y1=\"703\" x2=\"79\" y2=\"703\" class=\"messageLine1\" data-et=\"message\" data-id=\"i13\" data-from=\"API\" data-to=\"App\" stroke-width=\"2\" stroke=\"none\" marker-end=\"url(#diagram-506630e28a7938b5751fb081d1431099301d9fdcec4daeb36a2f3ae71caf7cde-arrowhead)\" style=\"stroke-dasharray: 3, 3; fill: none;\"></line></svg>"},"children":["sequenceDiagram\n  participant App as Your system\n  participant API as VBAPI\n  App->>API: GET contracts and plans, GET /relationships\n  API-->>App: coverage dates, plan_ID, relationship codes\n  App->>API: POST /subscribers\n  API-->>App: 200 subscriber\n  App->>API: POST /subscribers/{id}/members (insured, then dependents)\n  API-->>App: 200 member with member_Seq\n  App->>API: POST /subscribers/{id}/add-enrollment\n  API-->>App: 202 Accepted, no body\n  App->>API: GET /subscribers/{id}/enrollments\n  API-->>App: the new enrollment\n  App->>API: POST .../enrollments/.../plans\n  API-->>App: 200 enrollment plan\n  App->>API: POST /id-card-requests\n  API-->>App: 200 with idCardRequest_Key\n"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The samples use the fake subscriber ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DOCS-0001"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]}," allows only 9 characters, so check the length of your own IDs."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"steps","__idx":2},"children":["Steps"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-pick-the-contract-and-plan","__idx":3},"children":["1. Pick the contract and plan"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/group-contracts/listgroupcontract"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /groups/{groupID}/divisions/{divisionID}/contracts"]}]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/group-contract-plans/listgroupcontractplan"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /groups/{groupID}/divisions/{divisionID}/contracts/{coverageStart}/plans"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Enrollment points at a specific group contract, identified by its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverage_Start"]},". Read the division's contracts, choose the one that covers the employee's start date (the sample takes the latest), and read the plans offered on it. Pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverageStart"]}," in the path as a date, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2030-01-01"]},"."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        var contracts = new List<JsonNode>();\n        await foreach (var c in api.GetAllAsync($\"/groups/{GroupId}/divisions/{DivisionId}/contracts\"))\n            contracts.Add(c!);\n        var contract = contracts.OrderBy(c => c[\"coverage_Start\"]!.GetValue<string>(), StringComparer.Ordinal).Last(); // the latest contract\n        var coverageStart = DatePart(contract[\"coverage_Start\"]);\n        var coverageEnd = DatePart(contract[\"coverage_End\"]);\n        if (coverageEnd.Length == 0)\n            throw new InvalidOperationException(\"The contract has no coverage_End. add-enrollment needs an end_Date; set one for this sample.\");\n        var groupPlans = (await api.GetAsync($\"/groups/{GroupId}/divisions/{DivisionId}/contracts/{coverageStart}/plans\")).Data!.AsArray();\n        var planId = groupPlans[0]![\"plan_ID\"]!.GetValue<string>();\n        Console.WriteLine($\"Contract {coverageStart} to {coverageEnd} plan {planId}\");\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    contracts = sorted(\n        api.iter_pages(f\"/groups/{GROUP_ID}/divisions/{DIVISION_ID}/contracts\"),\n        key=lambda c: c[\"coverage_Start\"],\n    )\n    contract = contracts[-1]  # the latest contract\n    coverage_start = contract[\"coverage_Start\"][:10]\n    coverage_end = (contract.get(\"coverage_End\") or \"\")[:10]\n    if not coverage_end:\n        raise SystemExit(\"The contract has no coverage_End. add-enrollment needs an end_Date; set one for this sample.\")\n    plans = api.get(f\"/groups/{GROUP_ID}/divisions/{DIVISION_ID}/contracts/{coverage_start}/plans\").data\n    plan_id = plans[0][\"plan_ID\"]\n    print(\"Contract\", coverage_start, \"to\", coverage_end, \"plan\", plan_id)\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  const contracts: any[] = [];\n  for await (const c of api.getAll(`/groups/${GROUP_ID}/divisions/${DIVISION_ID}/contracts`)) contracts.push(c);\n  contracts.sort((a, b) => a.coverage_Start.localeCompare(b.coverage_Start));\n  const contract = contracts[contracts.length - 1]; // the latest contract\n  const coverageStart = datePart(contract.coverage_Start);\n  const coverageEnd = datePart(contract.coverage_End);\n  if (!coverageEnd) throw new Error(\"The contract has no coverage_End. add-enrollment needs an end_Date; set one for this sample.\");\n  const groupPlans: any[] = (await api.get(`/groups/${GROUP_ID}/divisions/${DIVISION_ID}/contracts/${coverageStart}/plans`)).data;\n  const planId: string = groupPlans[0].plan_ID;\n  console.log(\"Contract\", coverageStart, \"to\", coverageEnd, \"plan\", planId);\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save from the response:"]}," the contract's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverage_Start"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverage_End"]}," (steps 5 and 7), and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plan_ID"]}," (step 7)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-look-up-the-relationship-codes","__idx":4},"children":["2. Look up the relationship codes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/relationships/listrelationships"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /relationships"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Relationship codes are configured per database, so look them up rather than hardcoding them. The relationship whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber"]}," flag is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"1\""]}," marks the insured; VBAPI uses it to decide which member is the employee. The one whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["spouse"]}," flag is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"1\""]}," is the spouse. Other dependents (children, for example) use the code whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["description"]}," matches."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        var relationships = (await api.GetAsync(\"/relationships\")).Data!.AsArray();\n        var insuredCode = relationships.First(r => r![\"subscriber\"]?.GetValue<string>() == \"1\")![\"relate_Code\"]!.GetValue<string>();\n        var spouseCode = relationships.First(r => r![\"spouse\"]?.GetValue<string>() == \"1\")![\"relate_Code\"]!.GetValue<string>();\n        Console.WriteLine($\"Insured relationship: {insuredCode} spouse relationship: {spouseCode}\");\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    relationships = api.get(\"/relationships\").data\n    insured_code = next(r[\"relate_Code\"] for r in relationships if r.get(\"subscriber\") == \"1\")\n    spouse_code = next(r[\"relate_Code\"] for r in relationships if r.get(\"spouse\") == \"1\")\n    print(\"Insured relationship:\", insured_code, \"spouse relationship:\", spouse_code)\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  const relationships: any[] = (await api.get(\"/relationships\")).data;\n  const insuredCode: string = relationships.find((r) => r.subscriber === \"1\").relate_Code;\n  const spouseCode: string = relationships.find((r) => r.spouse === \"1\").relate_Code;\n  console.log(\"Insured relationship:\", insuredCode, \"spouse relationship:\", spouseCode);\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save from the response:"]}," the insured and spouse ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relate_Code"]}," values (step 4)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-create-the-subscriber","__idx":5},"children":["3. Create the subscriber"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/createsubscribers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Subscribers"]}," schema has no required fields. Send the family's ID, name, and address:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"subscriber_ID\": \"DOCS-0001\",\n  \"first_Name\": \"Sample\",\n  \"last_Name\": \"Member\",\n  \"address\": \"123 Example St\",\n  \"city\": \"Exampleville\",\n  \"state\": \"TX\",\n  \"zip_Code\": \"00000\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you leave out ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]},", VBAPI generates a 9-character ID and returns it; ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/generatesubscriberid"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers-generate-id"]}]}," also returns one. Creating a subscriber does not create any member, not even the employee, so step 4 is always needed."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        if (await ExistsAsync(api, $\"/subscribers/{SubscriberId}\"))\n        {\n            Console.WriteLine($\"Subscriber {SubscriberId} already exists; skipping create\");\n        }\n        else\n        {\n            var subscriber = (await api.PostAsync(\"/subscribers\", new\n            {\n                subscriber_ID = SubscriberId,\n                first_Name = \"Sample\",\n                last_Name = \"Member\",\n                address = \"123 Example St\",\n                city = \"Exampleville\",\n                state = \"TX\",\n                zip_Code = \"00000\",\n            })).Data!;\n            Console.WriteLine($\"Created subscriber {subscriber[\"subscriber_ID\"]}\");\n        }\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    if exists(api, f\"/subscribers/{SUBSCRIBER_ID}\"):\n        print(\"Subscriber\", SUBSCRIBER_ID, \"already exists; skipping create\")\n    else:\n        subscriber = api.post(\"/subscribers\", {\n            \"subscriber_ID\": SUBSCRIBER_ID,\n            \"first_Name\": \"Sample\",\n            \"last_Name\": \"Member\",\n            \"address\": \"123 Example St\",\n            \"city\": \"Exampleville\",\n            \"state\": \"TX\",\n            \"zip_Code\": \"00000\",\n        }).data\n        print(\"Created subscriber\", subscriber[\"subscriber_ID\"])\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  if (await exists(api, `/subscribers/${SUBSCRIBER_ID}`)) {\n    console.log(`Subscriber ${SUBSCRIBER_ID} already exists; skipping create`);\n  } else {\n    const subscriber = (\n      await api.post(\"/subscribers\", {\n        subscriber_ID: SUBSCRIBER_ID,\n        first_Name: \"Sample\",\n        last_Name: \"Member\",\n        address: \"123 Example St\",\n        city: \"Exampleville\",\n        state: \"TX\",\n        zip_Code: \"00000\",\n      })\n    ).data;\n    console.log(\"Created subscriber\", subscriber.subscriber_ID);\n  }\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save from the response:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]}," (every later step)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check it worked:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/getsubscribers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}"]}]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4-add-the-employee-and-dependents","__idx":6},"children":["4. Add the employee and dependents"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/members/createmembers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers/{subscriberID}/members"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create the employee first, with the insured relationship code, then each dependent. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]}," in the body must match the path. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Members"]}," has six required booleans; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," is the usual value for a new enrollee:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"subscriber_ID\": \"DOCS-0001\",\n  \"first_Name\": \"Sample\",\n  \"last_Name\": \"Member\",\n  \"relationship\": \"INSURED_CODE_FROM_STEP_2\",\n  \"adult_Dependent\": false,\n  \"continue_Coverage\": false,\n  \"initial_Volume_Salary_Pct\": false,\n  \"other_Insurance\": false,\n  \"smoker\": false,\n  \"use_Member_Plan_Year\": false\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Leave out ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["member_Seq"]}," and VBAPI assigns the next number in the family: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["01"]}," for the first member, then ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["02"]},", and so on, up to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["99"]},". Creating the employee first gives them ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["01"]},". Add ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["birth_Date"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sex"]},", and the other fields your plans' eligibility rules use; the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/members/createmembers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Members"]}," schema"]}," lists them."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        var members = (await api.GetAsync($\"/subscribers/{SubscriberId}/members\")).Data?.AsArray()\n            .Select(m => m!).ToList() ?? new List<JsonNode>();\n        var existing = members.Select(m => m[\"relationship\"]?.GetValue<string>()).ToHashSet();\n        var people = new[]\n        {\n            (FirstName: \"Sample\", Relationship: insuredCode), // the insured: create first\n            (FirstName: \"Sample Spouse\", Relationship: spouseCode),\n        };\n        foreach (var person in people)\n        {\n            if (existing.Contains(person.Relationship))\n                continue;\n            var member = (await api.PostAsync($\"/subscribers/{SubscriberId}/members\", new\n            {\n                subscriber_ID = SubscriberId,\n                first_Name = person.FirstName,\n                last_Name = \"Member\",\n                relationship = person.Relationship,\n                // Required booleans.\n                adult_Dependent = false,\n                continue_Coverage = false,\n                initial_Volume_Salary_Pct = false,\n                other_Insurance = false,\n                smoker = false,\n                use_Member_Plan_Year = false,\n            })).Data!;\n            members.Add(member);\n            Console.WriteLine($\"Created member {member[\"member_Seq\"]} {member[\"first_Name\"]}\");\n        }\n        var insuredSeq = members.First(m => m[\"relationship\"]?.GetValue<string>() == insuredCode)[\"member_Seq\"]!.GetValue<string>();\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    members = api.get(f\"/subscribers/{SUBSCRIBER_ID}/members\").data or []\n    existing = {m[\"relationship\"] for m in members}\n    people = [\n        {\"first_Name\": \"Sample\", \"relationship\": insured_code},  # the insured: create first\n        {\"first_Name\": \"Sample Spouse\", \"relationship\": spouse_code},\n    ]\n    for person in people:\n        if person[\"relationship\"] in existing:\n            continue\n        member = api.post(f\"/subscribers/{SUBSCRIBER_ID}/members\", {\n            \"subscriber_ID\": SUBSCRIBER_ID,\n            \"first_Name\": person[\"first_Name\"],\n            \"last_Name\": \"Member\",\n            \"relationship\": person[\"relationship\"],\n            # Required booleans.\n            \"adult_Dependent\": False,\n            \"continue_Coverage\": False,\n            \"initial_Volume_Salary_Pct\": False,\n            \"other_Insurance\": False,\n            \"smoker\": False,\n            \"use_Member_Plan_Year\": False,\n        }).data\n        members.append(member)\n        print(\"Created member\", member[\"member_Seq\"], member[\"first_Name\"])\n    insured_seq = next(m[\"member_Seq\"] for m in members if m[\"relationship\"] == insured_code)\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  const members: any[] = (await api.get(`/subscribers/${SUBSCRIBER_ID}/members`)).data ?? [];\n  const existing = new Set(members.map((m) => m.relationship));\n  const people = [\n    { firstName: \"Sample\", relationship: insuredCode }, // the insured: create first\n    { firstName: \"Sample Spouse\", relationship: spouseCode },\n  ];\n  for (const person of people) {\n    if (existing.has(person.relationship)) continue;\n    const member = (\n      await api.post(`/subscribers/${SUBSCRIBER_ID}/members`, {\n        subscriber_ID: SUBSCRIBER_ID,\n        first_Name: person.firstName,\n        last_Name: \"Member\",\n        relationship: person.relationship,\n        // Required booleans.\n        adult_Dependent: false,\n        continue_Coverage: false,\n        initial_Volume_Salary_Pct: false,\n        other_Insurance: false,\n        smoker: false,\n        use_Member_Plan_Year: false,\n      })\n    ).data;\n    members.push(member);\n    console.log(\"Created member\", member.member_Seq, member.first_Name);\n  }\n  const insuredSeq: string = members.find((m) => m.relationship === insuredCode).member_Seq;\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Example response (illustrative; field values are fake):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": {\n    \"subscriber_ID\": \"DOCS-0001\",\n    \"member_Seq\": \"01\",\n    \"first_Name\": \"Sample\",\n    \"last_Name\": \"Member\",\n    \"relationship\": \"INSURED_CODE_FROM_STEP_2\",\n    \"adult_Dependent\": false,\n    \"continue_Coverage\": false,\n    \"initial_Volume_Salary_Pct\": false,\n    \"other_Insurance\": false,\n    \"smoker\": false,\n    \"use_Member_Plan_Year\": false\n  },\n  \"error\": null,\n  \"debug\": { \"activityID\": \"00000000-0000-0000-0000-000000000000\" }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save from the response:"]}," each member's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["member_Seq"]}," (the employee's is used in step 9)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check it worked:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/members/listmembers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}/members"]}]}," lists every member."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"5-enroll-the-family","__idx":7},"children":["5. Enroll the family"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/adv.-enrollment/subscriberaddenrollment"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers/{subscriberID}/add-enrollment"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This creates the family's enrollment in the group contract. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subEnrollment"]}," names the contract by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["group_ID"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["division_ID"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["group_Coverage_Start"]}," (the contract's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverage_Start"]},"), and the family's coverage dates by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["start_Date"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end_Date"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"requesting_User_ID\": \"your-api-username\",\n  \"addMembers\": true,\n  \"subEnrollment\": {\n    \"subscriber_ID\": \"DOCS-0001\",\n    \"group_ID\": \"DOCS-GRP1\",\n    \"division_ID\": \"DOCS-DIV1\",\n    \"group_Coverage_Start\": \"2030-01-01T00:00:00\",\n    \"start_Date\": \"2030-01-01T00:00:00\",\n    \"end_Date\": \"2030-12-31T00:00:00\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["requesting_User_ID"]}," is required (up to 20 characters). The samples send the API user name."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end_Date"]}," is not marked required in the schema, but VBAPI rejects the request without it. Use the contract's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverage_End"]}," unless the employee's coverage ends sooner."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["addMembers: true"]}," includes the dependents. With ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},", only the insured member is made active on the enrollment."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["VBAPI checks that the subscriber exists, that at least one member exists, and that the group contract exists, and returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," with a message if not."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202 Accepted"]}," with no body."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        if (await FindEnrollmentAsync(api, coverageStart) is not null)\n        {\n            Console.WriteLine($\"Already enrolled in {GroupId} {DivisionId} {coverageStart}\");\n        }\n        else\n        {\n            var response = await api.PostAsync($\"/subscribers/{SubscriberId}/add-enrollment\", new\n            {\n                requesting_User_ID = requestingUserId,\n                addMembers = true,\n                subEnrollment = new\n                {\n                    subscriber_ID = SubscriberId,\n                    group_ID = GroupId,\n                    division_ID = DivisionId,\n                    group_Coverage_Start = $\"{coverageStart}T00:00:00\",\n                    start_Date = $\"{coverageStart}T00:00:00\",\n                    end_Date = $\"{coverageEnd}T00:00:00\",\n                },\n            });\n            Console.WriteLine($\"add-enrollment returned {(int)response.Status}\"); // 202 Accepted, no body\n        }\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    if find_enrollment():\n        print(\"Already enrolled in\", GROUP_ID, DIVISION_ID, coverage_start)\n    else:\n        response = api.post(f\"/subscribers/{SUBSCRIBER_ID}/add-enrollment\", {\n            \"requesting_User_ID\": REQUESTING_USER_ID,\n            \"addMembers\": True,\n            \"subEnrollment\": {\n                \"subscriber_ID\": SUBSCRIBER_ID,\n                \"group_ID\": GROUP_ID,\n                \"division_ID\": DIVISION_ID,\n                \"group_Coverage_Start\": f\"{coverage_start}T00:00:00\",\n                \"start_Date\": f\"{coverage_start}T00:00:00\",\n                \"end_Date\": f\"{coverage_end}T00:00:00\",\n            },\n        })\n        print(\"add-enrollment returned\", response.status)  # 202 Accepted, no body\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  if (await findEnrollment(api, coverageStart)) {\n    console.log(\"Already enrolled in\", GROUP_ID, DIVISION_ID, coverageStart);\n  } else {\n    const response = await api.post(`/subscribers/${SUBSCRIBER_ID}/add-enrollment`, {\n      requesting_User_ID: requestingUserId,\n      addMembers: true,\n      subEnrollment: {\n        subscriber_ID: SUBSCRIBER_ID,\n        group_ID: GROUP_ID,\n        division_ID: DIVISION_ID,\n        group_Coverage_Start: `${coverageStart}T00:00:00`,\n        start_Date: `${coverageStart}T00:00:00`,\n        end_Date: `${coverageEnd}T00:00:00`,\n      },\n    });\n    console.log(\"add-enrollment returned\", response.status); // 202 Accepted, no body\n  }\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"6-confirm-the-enrollment","__idx":8},"children":["6. Confirm the enrollment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscriber-enrollments/listsubenrollment"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}/enrollments"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," has no body, so read the enrollment back. The sample checks a few times, two seconds apart, before it gives up. Match on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["group_ID"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["division_ID"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["group_Coverage_Start"]},"."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        JsonNode? enrollment = null;\n        for (var attempt = 0; attempt < 5 && enrollment is null; attempt++)\n        {\n            enrollment = await FindEnrollmentAsync(api, coverageStart);\n            if (enrollment is null)\n                await Task.Delay(TimeSpan.FromSeconds(2));\n        }\n        if (enrollment is null)\n            throw new InvalidOperationException(\"The enrollment did not appear. Check the subscriber in VBASoftware.\");\n        var startDate = DatePart(enrollment[\"start_Date\"]);\n        Console.WriteLine($\"Enrollment {enrollment[\"group_ID\"]} {enrollment[\"division_ID\"]} {startDate} to {DatePart(enrollment[\"end_Date\"])}\");\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    enrollment = None\n    for _ in range(5):\n        enrollment = find_enrollment()\n        if enrollment:\n            break\n        time.sleep(2)\n    if not enrollment:\n        raise SystemExit(\"The enrollment did not appear. Check the subscriber in VBASoftware.\")\n    start_date = enrollment[\"start_Date\"][:10]\n    print(\"Enrollment\", enrollment[\"group_ID\"], enrollment[\"division_ID\"], start_date, \"to\", (enrollment.get(\"end_Date\") or \"\")[:10])\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  let enrollment: any;\n  for (let attempt = 0; attempt < 5 && !enrollment; attempt++) {\n    enrollment = await findEnrollment(api, coverageStart);\n    if (!enrollment) await sleep(2000);\n  }\n  if (!enrollment) throw new Error(\"The enrollment did not appear. Check the subscriber in VBASoftware.\");\n  const startDate = datePart(enrollment.start_Date);\n  console.log(\"Enrollment\", enrollment.group_ID, enrollment.division_ID, startDate, \"to\", datePart(enrollment.end_Date));\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Example response (illustrative; field values are fake):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": [\n    {\n      \"subscriber_ID\": \"DOCS-0001\",\n      \"group_ID\": \"DOCS-GRP1\",\n      \"division_ID\": \"DOCS-DIV1\",\n      \"group_Coverage_Start\": \"2030-01-01T00:00:00\",\n      \"start_Date\": \"2030-01-01T00:00:00\",\n      \"end_Date\": \"2030-12-31T00:00:00\"\n    }\n  ],\n  \"error\": null,\n  \"debug\": { \"activityID\": \"00000000-0000-0000-0000-000000000000\" }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save from the response:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["start_Date"]}," (with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["group_Coverage_Start"]},", it identifies the enrollment in step 7)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"7-add-the-plan-to-the-enrollment","__idx":9},"children":["7. Add the plan to the enrollment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscriber-enrollment-plans/createsubenrollmentplan"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /subscribers/{subscriberID}/enrollments/{groupID}/{divisionID}/{groupCoverageStart}/{startDate}/plans"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["add-enrollment"]}," does not choose a plan. Add one for each plan the family elected. The path identifies the enrollment from step 6; pass both dates as dates, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2030-01-01"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plan_ID"]}," must be a plan on the group contract (step 1)."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"subscriber_ID\": \"DOCS-0001\",\n  \"group_ID\": \"DOCS-GRP1\",\n  \"division_ID\": \"DOCS-DIV1\",\n  \"group_Coverage_Start\": \"2030-01-01T00:00:00\",\n  \"start_Date\": \"2030-01-01T00:00:00\",\n  \"plan_ID\": \"PLAN_ID_FROM_STEP_1\",\n  \"plan_Start\": \"2030-01-01T00:00:00\",\n  \"plan_End\": \"2030-12-31T00:00:00\",\n  \"use_Volume_Scale\": false\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["use_Volume_Scale"]}," is the one required boolean; it matters for life and disability volume plans. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tier"]}," sets the family's coverage tier when the plan is tiered."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        var enrolledPlans = (await api.GetAsync(plansPath)).Data?.AsArray() ?? new JsonArray();\n        if (enrolledPlans.Any(p => p![\"plan_ID\"]!.GetValue<string>() == planId))\n        {\n            Console.WriteLine($\"Plan {planId} already on the enrollment\");\n        }\n        else\n        {\n            await api.PostAsync(plansPath, new\n            {\n                subscriber_ID = SubscriberId,\n                group_ID = GroupId,\n                division_ID = DivisionId,\n                group_Coverage_Start = $\"{coverageStart}T00:00:00\",\n                start_Date = $\"{startDate}T00:00:00\",\n                plan_ID = planId,\n                plan_Start = $\"{startDate}T00:00:00\",\n                plan_End = $\"{coverageEnd}T00:00:00\",\n                use_Volume_Scale = false,\n            });\n            Console.WriteLine($\"Added plan {planId}\");\n        }\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    if any(p[\"plan_ID\"] == plan_id for p in api.get(plans_path).data or []):\n        print(\"Plan\", plan_id, \"already on the enrollment\")\n    else:\n        api.post(plans_path, {\n            \"subscriber_ID\": SUBSCRIBER_ID,\n            \"group_ID\": GROUP_ID,\n            \"division_ID\": DIVISION_ID,\n            \"group_Coverage_Start\": f\"{coverage_start}T00:00:00\",\n            \"start_Date\": f\"{start_date}T00:00:00\",\n            \"plan_ID\": plan_id,\n            \"plan_Start\": f\"{start_date}T00:00:00\",\n            \"plan_End\": f\"{coverage_end}T00:00:00\",\n            \"use_Volume_Scale\": False,\n        })\n        print(\"Added plan\", plan_id)\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  const enrolledPlans: any[] = (await api.get(plansPath)).data ?? [];\n  if (enrolledPlans.some((p) => p.plan_ID === planId)) {\n    console.log(\"Plan\", planId, \"already on the enrollment\");\n  } else {\n    await api.post(plansPath, {\n      subscriber_ID: SUBSCRIBER_ID,\n      group_ID: GROUP_ID,\n      division_ID: DIVISION_ID,\n      group_Coverage_Start: `${coverageStart}T00:00:00`,\n      start_Date: `${startDate}T00:00:00`,\n      plan_ID: planId,\n      plan_Start: `${startDate}T00:00:00`,\n      plan_End: `${coverageEnd}T00:00:00`,\n      use_Volume_Scale: false,\n    });\n    console.log(\"Added plan\", planId);\n  }\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"8-confirm-the-plans","__idx":10},"children":["8. Confirm the plans"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscriber-enrollment-plans/listsubenrollmentplan"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}/enrollments/{groupID}/{divisionID}/{groupCoverageStart}/{startDate}/plans"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This only reads data. You should see each plan with its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plan_Start"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plan_End"]},"."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        foreach (var plan in (await api.GetAsync(plansPath)).Data?.AsArray() ?? new JsonArray())\n            Console.WriteLine($\"Enrolled plan {plan![\"plan_ID\"]} {DatePart(plan[\"plan_Start\"])} to {DatePart(plan[\"plan_End\"])}\");\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    for plan in api.get(plans_path).data or []:\n        print(\"Enrolled plan\", plan[\"plan_ID\"], plan[\"plan_Start\"][:10], \"to\", (plan.get(\"plan_End\") or \"\")[:10])\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  for (const plan of (await api.get(plansPath)).data ?? []) {\n    console.log(\"Enrolled plan\", plan.plan_ID, datePart(plan.plan_Start), \"to\", datePart(plan.plan_End));\n  }\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"9-request-id-cards","__idx":11},"children":["9. Request ID cards"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-id-card-request-types/listidcardrequesttype"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /id-card-request-types"]}]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-id-card-requests/createidcardrequest"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /id-card-requests"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An ID card request records that a card should be produced for a member. Request types are configured per database, so read them first and use the right ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["request_Type"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"idCardRequest_Key\": 0,\n  \"renewal\": false,\n  \"subscriber_ID\": \"DOCS-0001\",\n  \"member_Seq\": \"01\",\n  \"group_ID\": \"DOCS-GRP1\",\n  \"division_ID\": \"DOCS-DIV1\",\n  \"request_Type\": \"REQUEST_TYPE_FROM_LOOKUP\",\n  \"request_Status\": \"REQ\",\n  \"request_Date\": \"2030-01-02T00:00:00\",\n  \"as_Of_Date\": \"2030-01-01T00:00:00\",\n  \"request_Quantity\": 1,\n  \"physical_Card_Requested\": true\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idCardRequest_Key"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["renewal"]}," are required. Send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]}," for the key; the database assigns it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["request_Status"]}," takes a value from ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/id-card-request-statuses/listidcardrequeststatuses"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /id-card-request-statuses"]}]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["REQ"]}," (Requested), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["COMPLETE"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CANCEL"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["as_Of_Date"]}," is the date the card is effective from."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["issuance_Type"]}," is left out. Which values your card vendor expects is set up per client; ask VBA before you send it."]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        var requestTypes = (await api.GetAsync(\"/id-card-request-types\")).Data!.AsArray();\n        var card = (await api.PostAsync(\"/id-card-requests\", new\n        {\n            idCardRequest_Key = 0, // 0 on create; VBAPI assigns the key\n            renewal = false,\n            subscriber_ID = SubscriberId,\n            member_Seq = insuredSeq,\n            group_ID = GroupId,\n            division_ID = DivisionId,\n            request_Type = requestTypes[0]![\"request_Type\"]!.GetValue<string>(),\n            request_Status = \"REQ\",\n            request_Date = $\"{DateTime.Today:yyyy-MM-dd}T00:00:00\",\n            as_Of_Date = $\"{startDate}T00:00:00\",\n            request_Quantity = 1,\n            physical_Card_Requested = true,\n        })).Data!;\n        var cardKey = card[\"idCardRequest_Key\"]!.GetValue<int>();\n        Console.WriteLine($\"ID card request {cardKey}\");\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    request_types = api.get(\"/id-card-request-types\").data\n    card = api.post(\"/id-card-requests\", {\n        \"idCardRequest_Key\": 0,  # 0 on create; VBAPI assigns the key\n        \"renewal\": False,\n        \"subscriber_ID\": SUBSCRIBER_ID,\n        \"member_Seq\": insured_seq,\n        \"group_ID\": GROUP_ID,\n        \"division_ID\": DIVISION_ID,\n        \"request_Type\": request_types[0][\"request_Type\"],\n        \"request_Status\": \"REQ\",\n        \"request_Date\": f\"{date.today().isoformat()}T00:00:00\",\n        \"as_Of_Date\": f\"{start_date}T00:00:00\",\n        \"request_Quantity\": 1,\n        \"physical_Card_Requested\": True,\n    }).data\n    card_key = card[\"idCardRequest_Key\"]\n    print(\"ID card request\", card_key)\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  const requestTypes: any[] = (await api.get(\"/id-card-request-types\")).data;\n  const card = (\n    await api.post(\"/id-card-requests\", {\n      idCardRequest_Key: 0, // 0 on create; VBAPI assigns the key\n      renewal: false,\n      subscriber_ID: SUBSCRIBER_ID,\n      member_Seq: insuredSeq,\n      group_ID: GROUP_ID,\n      division_ID: DIVISION_ID,\n      request_Type: requestTypes[0].request_Type,\n      request_Status: \"REQ\",\n      request_Date: `${new Date().toISOString().slice(0, 10)}T00:00:00`,\n      as_Of_Date: `${startDate}T00:00:00`,\n      request_Quantity: 1,\n      physical_Card_Requested: true,\n    })\n  ).data;\n  const cardKey: number = card.idCardRequest_Key;\n  console.log(\"ID card request\", cardKey);\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save from the response:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idCardRequest_Key"]}," (step 10)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"10-check-the-id-card-request","__idx":12},"children":["10. Check the ID card request"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-id-card-requests/getidcardrequest"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /id-card-requests/{iDCardRequestKey}"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Read the request back to confirm it was saved. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["request_Status"]}," changes as the request is handled, for example to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["COMPLETE"]},"."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        var savedCard = (await api.GetAsync($\"/id-card-requests/{cardKey}\")).Data!;\n        Console.WriteLine($\"ID card request {savedCard[\"idCardRequest_Key\"]} status: {savedCard[\"request_Status\"]}\");\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_employees.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    card = api.get(f\"/id-card-requests/{card_key}\").data\n    print(\"ID card request\", card[\"idCardRequest_Key\"], \"status:\", card.get(\"request_Status\"))\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollEmployees.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  const savedCard = (await api.get(`/id-card-requests/${cardKey}`)).data;\n  console.log(\"ID card request\", savedCard.idCardRequest_Key, \"status:\", savedCard.request_Status);\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Example response (illustrative; field values are fake):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": {\n    \"idCardRequest_Key\": 5001,\n    \"subscriber_ID\": \"DOCS-0001\",\n    \"member_Seq\": \"01\",\n    \"group_ID\": \"DOCS-GRP1\",\n    \"division_ID\": \"DOCS-DIV1\",\n    \"request_Type\": \"NEWENROLL\",\n    \"request_Status\": \"REQ\",\n    \"request_Date\": \"2030-01-02T00:00:00\",\n    \"as_Of_Date\": \"2030-01-01T00:00:00\",\n    \"request_Quantity\": 1,\n    \"renewal\": false,\n    \"physical_Card_Requested\": true\n  },\n  \"error\": null,\n  \"debug\": { \"activityID\": \"00000000-0000-0000-0000-000000000000\" }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"verify-the-result","__idx":13},"children":["Verify the result"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Run steps 6, 8, and 10 again; they only read data. The family should have one enrollment for the contract dates, the elected plans on it, and an ID card request with status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["REQ"]},". ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/listallenrollmentssubscriber"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}/list-all-enrollments"]}]}," gives a single view of every enrollment the subscriber has."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"census-variation-many-families-at-once","__idx":14},"children":["Census variation: many families at once"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For a census file, load subscribers and members with the batch operations, then run steps 5 to 10 for each family."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/updatebatchsubscribers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /subscribers-batch"]}]}," takes an array of subscribers."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/members/updatebatchmembers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /subscribers/{subscriberID}/members-batch"]}]}," takes one family's members."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Both create rows that do not exist and update rows that do, and return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["207 Multi-Status"]},". The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," array has one item per row, with its own ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["201"]}," created, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]}," updated, or an error status), a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," message, and an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," list of key and value pairs that identifies the row. One bad row does not stop the others, so always read every item."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["member_Seq"]}," in the batch. The batch decides between create and update by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]}," plus ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["member_Seq"]},", so without it every run adds new members. An update replaces the stored row with what you send, so include every field you want to keep."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sample reads ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#download"},"children":["census-sample.csv"]},", whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relationship"]}," column holds ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["insured"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["spouse"]},", or a code from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /relationships"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"text","header":{"controls":{"copy":{}}},"source":"subscriber_id,member_seq,relationship,first_name,last_name,address,city,state,zip_code\nDOCS-0101,01,insured,Sample,Member,123 Example St,Exampleville,TX,00000\nDOCS-0101,02,spouse,Sample Spouse,Member,123 Example St,Exampleville,TX,00000\nDOCS-0102,01,insured,Test,Person,123 Example St,Exampleville,TX,00000\n","lang":"text"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Load the subscribers and collect the failures:"]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesCensusPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        var families = ReadCsv(CensusFile()).GroupBy(row => row[\"subscriber_id\"]).ToList();\n        var subscribers = families.Select(family =>\n        {\n            var insured = family.First(r => r[\"relationship\"] == \"insured\");\n            return new\n            {\n                subscriber_ID = family.Key,\n                first_Name = insured[\"first_name\"],\n                last_Name = insured[\"last_name\"],\n                address = insured[\"address\"],\n                city = insured[\"city\"],\n                state = insured[\"state\"],\n                zip_Code = insured[\"zip_code\"],\n            };\n        }).ToList();\n        var response = await api.PutAsync(\"/subscribers-batch\", subscribers); // 207 Multi-Status\n        var failedIds = new HashSet<string?>();\n        foreach (var item in response.Data?.AsArray() ?? new JsonArray())\n        {\n            if (item![\"status\"]!.GetValue<int>() < 400)\n                continue;\n            var key = Key(item);\n            failedIds.Add(key.GetValueOrDefault(\"Subscriber_ID\"));\n            Console.WriteLine($\"Subscriber failed: {key.GetValueOrDefault(\"Subscriber_ID\")} {item[\"status\"]} {item[\"body\"]}\");\n        }\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_census.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    with CENSUS_FILE.open(newline=\"\", encoding=\"utf-8\") as file:\n        rows = list(csv.DictReader(file))\n    families = defaultdict(list)\n    for row in rows:\n        families[row[\"subscriber_id\"]].append(row)\n\n    subscribers = []\n    for subscriber_id, family in families.items():\n        insured = next(r for r in family if r[\"relationship\"] == \"insured\")\n        subscribers.append({\n            \"subscriber_ID\": subscriber_id,\n            \"first_Name\": insured[\"first_name\"],\n            \"last_Name\": insured[\"last_name\"],\n            \"address\": insured[\"address\"],\n            \"city\": insured[\"city\"],\n            \"state\": insured[\"state\"],\n            \"zip_Code\": insured[\"zip_code\"],\n        })\n    response = api.put(\"/subscribers-batch\", subscribers)  # 207 Multi-Status\n    failed_ids = set()\n    for item in failures(response):\n        key = {pair[\"key\"]: pair[\"value\"] for pair in item[\"id\"]}\n        failed_ids.add(key.get(\"Subscriber_ID\"))\n        print(\"Subscriber failed:\", key, item[\"status\"], item[\"body\"])\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollCensus.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  const families = new Map<string, Record<string, string>[]>();\n  for (const row of readCsv(CENSUS_FILE)) {\n    families.set(row.subscriber_id, [...(families.get(row.subscriber_id) ?? []), row]);\n  }\n  const subscribers = [...families].map(([subscriberId, family]) => {\n    const insured = family.find((r) => r.relationship === \"insured\")!;\n    return {\n      subscriber_ID: subscriberId,\n      first_Name: insured.first_name,\n      last_Name: insured.last_name,\n      address: insured.address,\n      city: insured.city,\n      state: insured.state,\n      zip_Code: insured.zip_code,\n    };\n  });\n  const response = await api.put(\"/subscribers-batch\", subscribers); // 207 Multi-Status\n  const failedIds = new Set<unknown>();\n  for (const item of response.data ?? []) {\n    if (item.status < 400) continue;\n    const key = keyOf(item);\n    failedIds.add(key.Subscriber_ID);\n    console.log(\"Subscriber failed:\", key, item.status, item.body);\n  }\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Load each family's members, skipping families whose subscriber failed:"]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/EnrollEmployeesCensusPlaybook.cs","language":"csharp","header":{"controls":{"copy":{}}},"lang":"csharp","source":"        foreach (var family in families)\n        {\n            if (failedIds.Contains(family.Key))\n                continue; // fix the subscriber row first, then re-run; the batch updates rows that exist\n            var members = family.Select(row => new\n            {\n                subscriber_ID = family.Key,\n                member_Seq = row[\"member_seq\"], // send it so a re-run updates instead of adding a member\n                first_Name = row[\"first_name\"],\n                last_Name = row[\"last_name\"],\n                relationship = codes.GetValueOrDefault(row[\"relationship\"], row[\"relationship\"]),\n                adult_Dependent = false,\n                continue_Coverage = false,\n                initial_Volume_Salary_Pct = false,\n                other_Insurance = false,\n                smoker = false,\n                use_Member_Plan_Year = false,\n            }).ToList();\n            var memberResponse = await api.PutAsync($\"/subscribers/{family.Key}/members-batch\", members);\n            foreach (var item in memberResponse.Data?.AsArray() ?? new JsonArray())\n                Console.WriteLine($\"{family.Key} {Key(item!).GetValueOrDefault(\"Member_Seq\")} {item![\"status\"]} {item[\"body\"]}\"); // 201 Created, 200 Updated\n        }\n        "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enroll_census.py","language":"python","header":{"controls":{"copy":{}}},"lang":"python","source":"    for subscriber_id, family in families.items():\n        if subscriber_id in failed_ids:\n            continue  # fix the subscriber row first, then re-run; the batch updates rows that exist\n        members = [{\n            \"subscriber_ID\": subscriber_id,\n            \"member_Seq\": row[\"member_seq\"],  # send it so a re-run updates instead of adding a member\n            \"first_Name\": row[\"first_name\"],\n            \"last_Name\": row[\"last_name\"],\n            \"relationship\": codes.get(row[\"relationship\"], row[\"relationship\"]),\n            \"adult_Dependent\": False,\n            \"continue_Coverage\": False,\n            \"initial_Volume_Salary_Pct\": False,\n            \"other_Insurance\": False,\n            \"smoker\": False,\n            \"use_Member_Plan_Year\": False,\n        } for row in family]\n        response = api.put(f\"/subscribers/{subscriber_id}/members-batch\", members)\n        for item in response.data or []:\n            key = {pair[\"key\"]: pair[\"value\"] for pair in item[\"id\"]}\n            print(subscriber_id, key.get(\"Member_Seq\"), item[\"status\"], item[\"body\"])  # 201 Created, 200 Updated\n    "},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"TypeScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../_samples/playbooks/enroll-employees/enrollCensus.ts","language":"typescript","header":{"controls":{"copy":{}}},"lang":"typescript","source":"  for (const [subscriberId, family] of families) {\n    if (failedIds.has(subscriberId)) continue; // fix the subscriber row first, then re-run; the batch updates rows that exist\n    const members = family.map((row) => ({\n      subscriber_ID: subscriberId,\n      member_Seq: row.member_seq, // send it so a re-run updates instead of adding a member\n      first_Name: row.first_name,\n      last_Name: row.last_name,\n      relationship: codes[row.relationship] ?? row.relationship,\n      adult_Dependent: false,\n      continue_Coverage: false,\n      initial_Volume_Salary_Pct: false,\n      other_Insurance: false,\n      smoker: false,\n      use_Member_Plan_Year: false,\n    }));\n    const memberResponse = await api.put(`/subscribers/${subscriberId}/members-batch`, members);\n    for (const item of memberResponse.data ?? []) {\n      console.log(subscriberId, keyOf(item).Member_Seq, item.status, item.body); // 201 Created, 200 Updated\n    }\n  }\n  "},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["207"]}," response (illustrative; field values are fake):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": [\n    { \"id\": [{ \"key\": \"Subscriber_ID\", \"value\": \"DOCS-0101\" }], \"status\": 201, \"body\": \"Created\" },\n    { \"id\": [{ \"key\": \"Subscriber_ID\", \"value\": \"DOCS-0102\" }], \"status\": 400, \"body\": \"A validation message for this row\" }\n  ],\n  \"error\": null,\n  \"debug\": { \"activityID\": \"00000000-0000-0000-0000-000000000000\" }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Keep batches to a size your system can retry, and stay within the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/concepts/rate-limits-and-performance"},"children":["rate limits"]}," when you loop over families."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"safe-to-re-run","__idx":15},"children":["Safe to re-run?"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The main sample checks before each create: it skips the subscriber if ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}"]}," finds it, skips members whose relationship is already in the family, skips ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["add-enrollment"]}," if the enrollment exists, and skips plans already on it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["add-enrollment"]}," creates the enrollment row keyed by subscriber, group, division, contract start, and start date, so repeating it with the same dates fails rather than creating a duplicate."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Each ID card request is a new record. Running step 9 twice requests two cards."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The census batches are upserts: re-running them updates the same rows, as long as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["member_Seq"]}," is in the file."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"undo","__idx":16},"children":["Undo"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To remove a test family:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Delete the ID card request with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-id-card-requests/deleteidcardrequest"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /id-card-requests/{iDCardRequestKey}"]}]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Delete the subscriber with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscribers/deletesubscribers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /subscribers/{subscriberID}"]}]},". The database removes the subscriber's enrollments and members with it, and refuses the delete if the subscriber has claims, authorizations, or accumulators."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Deletes return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["204"]},". To remove only one enrollment or one dependent, use ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/subscriber-enrollments/deletesubenrollment"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /subscribers/{subscriberID}/enrollments/{groupID}/{divisionID}/{groupCoverageStart}/{startDate}"]}]}," or ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/members/deletemembers"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /subscribers/{subscriberID}/members/{memberSeq}"]}]},". Deleting the insured member this way returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},"; delete the subscriber instead. For a real member who is leaving, disenroll instead of deleting; see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/playbooks/disenroll-member"},"children":["Disenroll a member"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"common-errors","__idx":17},"children":["Common errors"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Symptom"},"children":["Symptom"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Likely cause"},"children":["Likely cause"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Fix"},"children":["Fix"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," \"No member exists for the Subscriber ID\" on step 5"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Members were not created"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Run step 4 first"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," \"The Group Contract does not exsit\" on step 5"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["group_Coverage_Start"]}," does not match a contract's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverage_Start"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use the exact date from step 1"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," \"The End Date must be populated\" on step 5"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end_Date"]}," was left out"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end_Date"]},", usually the contract's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["coverage_End"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," on a member, naming ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The body ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriber_ID"]}," does not match the path"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Send the same ID in both"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["422"]}," \"Maximum of 99 members exceeded\""]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The family already has ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["member_Seq"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["99"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check for duplicate members"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Batch item with status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["500"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["That row failed validation"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]},", fix the row, and re-run; the other rows are already saved"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"message\":\"Forbidden\"}"]}," on every call"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["x-api-key"]}," header is missing or wrong"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/concepts/errors"},"children":["Errors and troubleshooting"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Contacting support"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Send VBA support:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debug.activityID"]}," from the response"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["the date and time of the call, with time zone"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["the method and path, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /claim-batches"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["the full ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["error"]}," object from the response"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["the request body, with passwords, tokens, and personal data removed"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Never send your password, API key, or tokens. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/help/support"},"children":["Support and escalation"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"variations","__idx":18},"children":["Variations"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Member-level plans:"]}," when the group contract's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["benefit_At_Member"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"1\""]},", plans are chosen per member. Read them with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/member-enrollment-plans/listmemenrollmentplan"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /subscribers/{subscriberID}/members/{memberSeq}/groups/{groupID}/divisions/{divisionID}/enrollments"]}]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Producing the cards:"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi/vbasoftware/vbasoftware.api/adv.-enrollment/idcardrequestreportseries"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /idcardrequest-process-automation"]}]}," takes a list of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idCardRequest_Key"]}," values and runs the process automation your database has configured for ID card requests. Ask VBA how card production is set up for you."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"set-up-your-environment","__idx":19},"children":["Set up your environment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The samples read your credentials from environment variables, so nothing secret is written into code. Set them in the terminal you run the samples from:"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"PowerShell","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"powershell","header":{"controls":{"copy":{}}},"source":"$env:VBAPI_BASE_URL    = \"https://vbapi.vbasoftware.com/vbasoftware\"\n$env:VBAPI_API_KEY     = \"your-api-key\"\n$env:VBAPI_CLIENT_ID   = \"your-client-id\"\n$env:VBAPI_CLIENT_CODE = \"your-client-code\"\n$env:VBAPI_DATABASE    = \"YOUR_DATABASE\"\n$env:VBAPI_USERNAME    = \"your-api-username\"\n$env:VBAPI_PASSWORD    = \"your-api-password\"\n$env:VBAPI_USER_AGENT  = \"YourCompany-Integration/1.0\"\n","lang":"powershell"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"bash","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"export VBAPI_BASE_URL=\"https://vbapi.vbasoftware.com/vbasoftware\"\nexport VBAPI_API_KEY=\"your-api-key\"\nexport VBAPI_CLIENT_ID=\"your-client-id\"\nexport VBAPI_CLIENT_CODE=\"your-client-code\"\nexport VBAPI_DATABASE=\"YOUR_DATABASE\"\nexport VBAPI_USERNAME=\"your-api-username\"\nexport VBAPI_PASSWORD=\"your-api-password\"\nexport VBAPI_USER_AGENT=\"YourCompany-Integration/1.0\"\n","lang":"bash"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In production code, load these from your secrets manager instead."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"download","__idx":20},"children":["Download"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The full runnable samples are in the docs repository under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["_samples/playbooks/enroll-employees/"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EnrollEmployeesPlaybook.cs"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enroll_employees.py"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enrollEmployees.ts"]}," for one family, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EnrollEmployeesCensusPlaybook.cs"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enroll_census.py"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enrollCensus.ts"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["census-sample.csv"]}," for the census variation. See ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["_samples/playbooks/README.md"]}," for how to run them."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related","__idx":21},"children":["Related"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Concepts: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/concepts/data-model"},"children":["Data model"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/concepts/ids-and-conventions"},"children":["IDs and conventions"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/concepts/requests-and-responses"},"children":["Requests and responses"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Previous playbook: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/playbooks/onboard-employer-group"},"children":["Onboard a new employer group"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Next playbooks: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/playbooks/member-self-service"},"children":["Member self-service"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/developer-portal/playbooks/premium-billing-and-payments"},"children":["Bill premiums and apply payments"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ask the AI: \"Using the Enroll employees playbook, write a Python function that loads a census CSV with the batch endpoints and lists the rows that failed.\""]}]}]},"headings":[{"value":"Enroll employees and dependents, and request ID cards","id":"enroll-employees-and-dependents-and-request-id-cards","depth":1},{"value":"How it fits together","id":"how-it-fits-together","depth":2},{"value":"Steps","id":"steps","depth":2},{"value":"1. Pick the contract and plan","id":"1-pick-the-contract-and-plan","depth":3},{"value":"2. Look up the relationship codes","id":"2-look-up-the-relationship-codes","depth":3},{"value":"3. Create the subscriber","id":"3-create-the-subscriber","depth":3},{"value":"4. Add the employee and dependents","id":"4-add-the-employee-and-dependents","depth":3},{"value":"5. Enroll the family","id":"5-enroll-the-family","depth":3},{"value":"6. Confirm the enrollment","id":"6-confirm-the-enrollment","depth":3},{"value":"7. Add the plan to the enrollment","id":"7-add-the-plan-to-the-enrollment","depth":3},{"value":"8. Confirm the plans","id":"8-confirm-the-plans","depth":3},{"value":"9. Request ID cards","id":"9-request-id-cards","depth":3},{"value":"10. Check the ID card request","id":"10-check-the-id-card-request","depth":3},{"value":"Verify the result","id":"verify-the-result","depth":2},{"value":"Census variation: many families at once","id":"census-variation-many-families-at-once","depth":2},{"value":"Safe to re-run?","id":"safe-to-re-run","depth":2},{"value":"Undo","id":"undo","depth":2},{"value":"Common errors","id":"common-errors","depth":2},{"value":"Variations","id":"variations","depth":2},{"value":"Set up your environment","id":"set-up-your-environment","depth":2},{"value":"Download","id":"download","depth":2},{"value":"Related","id":"related","depth":2}],"frontmatter":{"title":"Enroll employees and dependents, and request ID cards","description":"Add a subscriber and their dependents, enroll the family in an employer group's contract and plan, and request ID cards, for one employee or a whole census file.","seo":{"title":"Enroll employees and dependents, and request ID cards"}},"lastModified":"2026-10-26T21:09:33.693Z","pagePropGetterError":{"message":"","name":""}},"slug":"/developer-portal/playbooks/enroll-employees","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}