[{"data":1,"prerenderedAt":2157},["ShallowReactive",2],{"navigation_docs_en":3,"-en-integration-api-reference-sync":427,"-en-integration-api-reference-sync-surround":2152},[4,31,117,188,238,271,310,369,378],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":30},"Getting started","i-hugeicons-rocket-01","\u002Fen\u002Fgetting-started","en\u002F01.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"What is DDM?","\u002Fen\u002Fgetting-started\u002Fwhat-is-ddm","en\u002F01.getting-started\u002F01.what-is-ddm","i-hugeicons-information-circle",{"title":16,"path":17,"stem":18,"icon":19},"Account and sign-in","\u002Fen\u002Fgetting-started\u002Fsign-in","en\u002F01.getting-started\u002F02.sign-in","i-hugeicons-key-01",{"title":21,"path":22,"stem":23,"icon":24},"AI in DDM","\u002Fen\u002Fgetting-started\u002Fai-in-ddm","en\u002F01.getting-started\u002F03.ai-in-ddm","i-hugeicons-ai-magic",{"title":26,"path":27,"stem":28,"icon":29},"System status","\u002Fen\u002Fgetting-started\u002Fsystem-status","en\u002F01.getting-started\u002F04.system-status","i-hugeicons-activity-03",false,{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":30},"CMS","i-hugeicons-dashboard-square-01","\u002Fen\u002Fcms","en\u002F02.cms",[37,42,47,52,57,62,67,72,77,82,87,92,97,102,107,112],{"title":38,"path":39,"stem":40,"icon":41},"The CMS at a glance","\u002Fen\u002Fcms\u002Foverview","en\u002F02.cms\u002F01.overview","i-hugeicons-compass-01",{"title":43,"path":44,"stem":45,"icon":46},"Uploading documents","\u002Fen\u002Fcms\u002Fupload","en\u002F02.cms\u002F02.upload","i-hugeicons-upload-01",{"title":48,"path":49,"stem":50,"icon":51},"Categories","\u002Fen\u002Fcms\u002Fcategories","en\u002F02.cms\u002F03.categories","i-hugeicons-folder-tree",{"title":53,"path":54,"stem":55,"icon":56},"Editing documents","\u002Fen\u002Fcms\u002Fdocuments","en\u002F02.cms\u002F04.documents","i-hugeicons-file-edit",{"title":58,"path":59,"stem":60,"icon":61},"Searching and filtering","\u002Fen\u002Fcms\u002Fsearch-and-filters","en\u002F02.cms\u002F05.search-and-filters","i-hugeicons-search-01",{"title":63,"path":64,"stem":65,"icon":66},"Groups and permissions","\u002Fen\u002Fcms\u002Fgroups-and-permissions","en\u002F02.cms\u002F06.groups-and-permissions","i-hugeicons-user-multiple",{"title":68,"path":69,"stem":70,"icon":71},"Users","\u002Fen\u002Fcms\u002Fusers","en\u002F02.cms\u002F07.users","i-hugeicons-user-add-01",{"title":73,"path":74,"stem":75,"icon":76},"Approvals","\u002Fen\u002Fcms\u002Fapprovals","en\u002F02.cms\u002F08.approvals","i-hugeicons-checkmark-badge-01",{"title":78,"path":79,"stem":80,"icon":81},"Markets and translations","\u002Fen\u002Fcms\u002Fmarkets-and-translations","en\u002F02.cms\u002F09.markets-and-translations","i-hugeicons-globe-02",{"title":83,"path":84,"stem":85,"icon":86},"Note templates","\u002Fen\u002Fcms\u002Fnote-templates","en\u002F02.cms\u002F10.note-templates","i-hugeicons-layout-01",{"title":88,"path":89,"stem":90,"icon":91},"Usage and audit log","\u002Fen\u002Fcms\u002Fusage-and-audit","en\u002F02.cms\u002F11.usage-and-audit","i-hugeicons-chart-column",{"title":93,"path":94,"stem":95,"icon":96},"AI assistant","\u002Fen\u002Fcms\u002Fassistant","en\u002F02.cms\u002F12.assistant","i-hugeicons-sparkles",{"title":98,"path":99,"stem":100,"icon":101},"Settings","\u002Fen\u002Fcms\u002Fsettings","en\u002F02.cms\u002F13.settings","i-hugeicons-settings-02",{"title":103,"path":104,"stem":105,"icon":106},"Plans","\u002Fen\u002Fcms\u002Fplans","en\u002F02.cms\u002F14.plans","i-hugeicons-package",{"title":108,"path":109,"stem":110,"icon":111},"Feature requests","\u002Fen\u002Fcms\u002Ffeature-requests","en\u002F02.cms\u002F15.feature-requests","i-hugeicons-idea-01",{"title":113,"path":114,"stem":115,"icon":116},"Report a bug","\u002Fen\u002Fcms\u002Fbug-reports","en\u002F02.cms\u002F16.bug-reports","i-hugeicons-bug-01",{"title":118,"icon":119,"path":120,"stem":121,"children":122,"page":30},"App","i-hugeicons-smart-phone-01","\u002Fen\u002Fapp","en\u002F03.app",[123,128,133,138,143,147,152,157,162,167,170,173,176,179,184],{"title":124,"path":125,"stem":126,"icon":127},"Signing in and finding your way","\u002Fen\u002Fapp\u002Foverview","en\u002F03.app\u002F01.overview","i-hugeicons-login-03",{"title":129,"path":130,"stem":131,"icon":132},"Tabs and split view","\u002Fen\u002Fapp\u002Ftabs","en\u002F03.app\u002F02.tabs","i-hugeicons-layout-2-column",{"title":134,"path":135,"stem":136,"icon":137},"Finding and reading documents","\u002Fen\u002Fapp\u002Fdocuments","en\u002F03.app\u002F03.documents","i-hugeicons-file-01",{"title":139,"path":140,"stem":141,"icon":142},"Favorites","\u002Fen\u002Fapp\u002Ffavorites","en\u002F03.app\u002F04.favorites","i-hugeicons-favourite",{"title":144,"path":145,"stem":146,"icon":61},"Searching","\u002Fen\u002Fapp\u002Fsearch","en\u002F03.app\u002F05.search",{"title":148,"path":149,"stem":150,"icon":151},"Notes","\u002Fen\u002Fapp\u002Fnotes","en\u002F03.app\u002F06.notes","i-hugeicons-note-edit",{"title":153,"path":154,"stem":155,"icon":156},"Calendar and appointments","\u002Fen\u002Fapp\u002Fcalendar","en\u002F03.app\u002F07.calendar","i-hugeicons-calendar-03",{"title":158,"path":159,"stem":160,"icon":161},"Sending to customers","\u002Fen\u002Fapp\u002Foutbox","en\u002F03.app\u002F08.outbox","i-hugeicons-sent",{"title":163,"path":164,"stem":165,"icon":166},"Working offline","\u002Fen\u002Fapp\u002Foffline","en\u002F03.app\u002F09.offline","i-hugeicons-wifi-off-01",{"title":93,"path":168,"stem":169,"icon":96},"\u002Fen\u002Fapp\u002Fassistant","en\u002F03.app\u002F10.assistant",{"title":98,"path":171,"stem":172,"icon":101},"\u002Fen\u002Fapp\u002Fsettings","en\u002F03.app\u002F11.settings",{"title":108,"path":174,"stem":175,"icon":111},"\u002Fen\u002Fapp\u002Ffeature-requests","en\u002F03.app\u002F12.feature-requests",{"title":113,"path":177,"stem":178,"icon":116},"\u002Fen\u002Fapp\u002Fbug-reports","en\u002F03.app\u002F13.bug-reports",{"title":180,"path":181,"stem":182,"icon":183},"Desktop app","\u002Fen\u002Fapp\u002Fdesktop-app","en\u002F03.app\u002F14.desktop-app","i-hugeicons-computer",{"title":185,"path":186,"stem":187,"icon":119},"Mobile app","\u002Fen\u002Fapp\u002Fmobile-app","en\u002F03.app\u002F15.mobile-app",{"title":189,"icon":190,"path":191,"stem":192,"children":193,"page":30},"Sign-in & directories","i-hugeicons-security-check","\u002Fen\u002Fsign-in-and-directories","en\u002F04.sign-in-and-directories",[194,198,202,207,212,217,222,226,230,234],{"title":195,"path":196,"stem":197,"icon":19},"Sign-in methods","\u002Fen\u002Fsign-in-and-directories\u002Fsign-in-methods","en\u002F04.sign-in-and-directories\u002F01.sign-in-methods",{"title":199,"path":200,"stem":201,"icon":190},"Single sign-on","\u002Fen\u002Fsign-in-and-directories\u002Fsingle-sign-on","en\u002F04.sign-in-and-directories\u002F02.single-sign-on",{"title":203,"path":204,"stem":205,"icon":206},"Directory services (LDAP)","\u002Fen\u002Fsign-in-and-directories\u002Fdirectory-services","en\u002F04.sign-in-and-directories\u002F03.directory-services","i-hugeicons-hierarchy",{"title":208,"path":209,"stem":210,"icon":211},"Synchronisation and sign-in","\u002Fen\u002Fsign-in-and-directories\u002Fdirectory-sync","en\u002F04.sign-in-and-directories\u002F04.directory-sync","i-hugeicons-refresh",{"title":213,"path":214,"stem":215,"icon":216},"Microsoft Entra ID","\u002Fen\u002Fsign-in-and-directories\u002Fmicrosoft-entra-id","en\u002F04.sign-in-and-directories\u002F05.microsoft-entra-id","i-hugeicons-building-03",{"title":218,"path":219,"stem":220,"icon":221},"Okta","\u002Fen\u002Fsign-in-and-directories\u002Fokta","en\u002F04.sign-in-and-directories\u002F06.okta","i-hugeicons-finger-print",{"title":223,"path":224,"stem":225,"icon":81},"Google Workspace","\u002Fen\u002Fsign-in-and-directories\u002Fgoogle-workspace","en\u002F04.sign-in-and-directories\u002F07.google-workspace",{"title":227,"path":228,"stem":229,"icon":119},"Two-factor authentication","\u002Fen\u002Fsign-in-and-directories\u002Ftwo-factor-authentication","en\u002F04.sign-in-and-directories\u002F08.two-factor-authentication",{"title":231,"path":232,"stem":233,"icon":221},"Passkeys","\u002Fen\u002Fsign-in-and-directories\u002Fpasskeys","en\u002F04.sign-in-and-directories\u002F09.passkeys",{"title":235,"path":236,"stem":237,"icon":156},"Calendar access","\u002Fen\u002Fsign-in-and-directories\u002Fcalendar-access","en\u002F04.sign-in-and-directories\u002F10.calendar-access",{"title":239,"icon":240,"path":241,"stem":242,"children":243,"page":30},"MCP server","i-hugeicons-ai-network","\u002Fen\u002Fmcp-server","en\u002F05.mcp-server",[244,248,253,257,262,266],{"title":245,"path":246,"stem":247,"icon":240},"Overview","\u002Fen\u002Fmcp-server\u002Foverview","en\u002F05.mcp-server\u002F01.overview",{"title":249,"path":250,"stem":251,"icon":252},"Setup","\u002Fen\u002Fmcp-server\u002Fsetup","en\u002F05.mcp-server\u002F02.setup","i-hugeicons-plug-socket",{"title":254,"path":255,"stem":256,"icon":111},"What you can do with it","\u002Fen\u002Fmcp-server\u002Fuse-cases","en\u002F05.mcp-server\u002F03.use-cases",{"title":258,"path":259,"stem":260,"icon":261},"Tools","\u002Fen\u002Fmcp-server\u002Ftools","en\u002F05.mcp-server\u002F04.tools","i-hugeicons-wrench-01",{"title":263,"path":264,"stem":265,"icon":76},"Approving changes","\u002Fen\u002Fmcp-server\u002Fapproving-changes","en\u002F05.mcp-server\u002F05.approving-changes",{"title":267,"path":268,"stem":269,"icon":270},"Administration & security","\u002Fen\u002Fmcp-server\u002Fadmin-and-security","en\u002F05.mcp-server\u002F06.admin-and-security","i-hugeicons-shield-key",{"title":272,"icon":273,"path":274,"stem":275,"children":276,"page":30},"External sources","i-hugeicons-database-sync","\u002Fen\u002Fexternal-sources","en\u002F06.external-sources",[277,280,285,290,295,300,305],{"title":245,"path":278,"stem":279,"icon":273},"\u002Fen\u002Fexternal-sources\u002Foverview","en\u002F06.external-sources\u002F01.overview",{"title":281,"path":282,"stem":283,"icon":284},"SharePoint","\u002Fen\u002Fexternal-sources\u002Fsharepoint","en\u002F06.external-sources\u002F02.sharepoint","i-hugeicons-microsoft",{"title":286,"path":287,"stem":288,"icon":289},"OneDrive","\u002Fen\u002Fexternal-sources\u002Fonedrive","en\u002F06.external-sources\u002F03.onedrive","i-hugeicons-folder-cloud",{"title":291,"path":292,"stem":293,"icon":294},"Google Drive","\u002Fen\u002Fexternal-sources\u002Fgoogle-drive","en\u002F06.external-sources\u002F04.google-drive","i-hugeicons-google-drive",{"title":296,"path":297,"stem":298,"icon":299},"FTP \u002F SFTP","\u002Fen\u002Fexternal-sources\u002Fftp-sftp","en\u002F06.external-sources\u002F05.ftp-sftp","i-hugeicons-server-stack-01",{"title":301,"path":302,"stem":303,"icon":304},"REST interface","\u002Fen\u002Fexternal-sources\u002Frest","en\u002F06.external-sources\u002F06.rest","i-hugeicons-api",{"title":306,"path":307,"stem":308,"icon":309},"SOAP interface","\u002Fen\u002Fexternal-sources\u002Fsoap","en\u002F06.external-sources\u002F07.soap","i-hugeicons-source-code",{"title":311,"icon":304,"path":312,"stem":313,"children":314,"page":30},"Integration API","\u002Fen\u002Fintegration-api","en\u002F07.integration-api",[315,318,322,327,332,337,341,346,350,354,359,364],{"title":245,"path":316,"stem":317,"icon":14},"\u002Fen\u002Fintegration-api\u002Foverview","en\u002F07.integration-api\u002F01.overview",{"title":319,"path":320,"stem":321,"icon":19},"Authentication","\u002Fen\u002Fintegration-api\u002Fauthentication","en\u002F07.integration-api\u002F02.authentication",{"title":323,"path":324,"stem":325,"icon":326},"Conventions","\u002Fen\u002Fintegration-api\u002Fconventions","en\u002F07.integration-api\u002F03.conventions","i-hugeicons-book-open-01",{"title":328,"path":329,"stem":330,"icon":331},"Pushing documents","\u002Fen\u002Fintegration-api\u002Fpushing-documents","en\u002F07.integration-api\u002F04.pushing-documents","i-hugeicons-upload-02",{"title":333,"path":334,"stem":335,"icon":336},"Consuming content","\u002Fen\u002Fintegration-api\u002Fconsuming-content","en\u002F07.integration-api\u002F05.consuming-content","i-hugeicons-download-02",{"title":338,"path":339,"stem":340,"icon":137},"Reference: documents","\u002Fen\u002Fintegration-api\u002Freference-documents","en\u002F07.integration-api\u002F06.reference-documents",{"title":342,"path":343,"stem":344,"icon":345},"Reference: categories, tags, markets","\u002Fen\u002Fintegration-api\u002Freference-categories-tags","en\u002F07.integration-api\u002F07.reference-categories-tags","i-hugeicons-folder-01",{"title":347,"path":348,"stem":349,"icon":211},"Reference: sync manifest","\u002Fen\u002Fintegration-api\u002Freference-sync","en\u002F07.integration-api\u002F08.reference-sync",{"title":351,"path":352,"stem":353,"icon":309},"OpenAPI","\u002Fen\u002Fintegration-api\u002Fopenapi","en\u002F07.integration-api\u002F09.openapi",{"title":355,"path":356,"stem":357,"icon":358},"Changelog","\u002Fen\u002Fintegration-api\u002Fchangelog","en\u002F07.integration-api\u002F10.changelog","i-hugeicons-time-schedule",{"title":360,"path":361,"stem":362,"icon":363},"Reference: groups, markets, access","\u002Fen\u002Fintegration-api\u002Freference-groups-access","en\u002F07.integration-api\u002F11.reference-groups-access","i-hugeicons-user-lock-01",{"title":365,"path":366,"stem":367,"icon":368},"Moving from CMWS","\u002Fen\u002Fintegration-api\u002Fcmws","en\u002F07.integration-api\u002F12.cmws","i-hugeicons-arrow-reload-horizontal",{"title":370,"icon":371,"path":372,"stem":373,"children":374,"page":30},"What's new","i-hugeicons-gift","\u002Fen\u002Fwhats-new","en\u002F08.whats-new",[375],{"title":355,"path":376,"stem":377,"icon":358},"\u002Fen\u002Fwhats-new\u002Fchangelog","en\u002F08.whats-new\u002F01.changelog",{"title":379,"icon":299,"path":380,"stem":381,"children":382,"page":30},"Self-hosting","\u002Fen\u002Fself-hosting","en\u002F09.self-hosting",[383,386,390,395,399,404,408,413,418,422],{"title":245,"path":384,"stem":385,"icon":14},"\u002Fen\u002Fself-hosting\u002Foverview","en\u002F09.self-hosting\u002F01.overview",{"title":387,"path":388,"stem":389,"icon":106},"Docker Compose","\u002Fen\u002Fself-hosting\u002Fdocker-compose","en\u002F09.self-hosting\u002F02.docker-compose",{"title":391,"path":392,"stem":393,"icon":394},"Kubernetes","\u002Fen\u002Fself-hosting\u002Fkubernetes","en\u002F09.self-hosting\u002F03.kubernetes","i-hugeicons-cloud",{"title":396,"path":397,"stem":398,"icon":101},"Configuration","\u002Fen\u002Fself-hosting\u002Fconfiguration","en\u002F09.self-hosting\u002F04.configuration",{"title":400,"path":401,"stem":402,"icon":403},"Licence","\u002Fen\u002Fself-hosting\u002Flicence","en\u002F09.self-hosting\u002F05.licence","i-hugeicons-license",{"title":405,"path":406,"stem":407,"icon":211},"Updates","\u002Fen\u002Fself-hosting\u002Fupdates","en\u002F09.self-hosting\u002F06.updates",{"title":409,"path":410,"stem":411,"icon":412},"Postgres","\u002Fen\u002Fself-hosting\u002Fpostgres","en\u002F09.self-hosting\u002F07.postgres","i-hugeicons-database",{"title":414,"path":415,"stem":416,"icon":417},"Backups","\u002Fen\u002Fself-hosting\u002Fbackups","en\u002F09.self-hosting\u002F08.backups","i-hugeicons-database-restore",{"title":419,"path":420,"stem":421,"icon":261},"Troubleshooting","\u002Fen\u002Fself-hosting\u002Ftroubleshooting","en\u002F09.self-hosting\u002F09.troubleshooting",{"title":423,"path":424,"stem":425,"icon":426},"Firewall","\u002Fen\u002Fself-hosting\u002Ffirewall","en\u002F09.self-hosting\u002F10.firewall","i-hugeicons-firewall",{"id":428,"title":347,"body":429,"description":2145,"extension":2146,"links":2147,"meta":2148,"navigation":2149,"path":348,"seo":2150,"stem":349,"__hash__":2151},"docs_en\u002Fen\u002F07.integration-api\u002F08.reference-sync.md",{"type":430,"value":431,"toc":2140},"minimark",[432,440,453,478,483,528,537,1074,1079,1083,1092,2039,2061,2075,2079,2133,2136],[433,434,436],"h2",{"id":435},"get-sync",[437,438,439],"code",{},"GET \u002Fsync",[441,442,443,444,448,449,452],"p",{},"Scope ",[445,446,447],"strong",{},"read",". Every document and category the key can see, with only the fields needed to compare. Use it to find what has ",[445,450,451],{},"gone",": deleted, archived out of the released view, or out of the acting person's reach.",[454,455,456,468,473],"field-group",{},[457,458,461,464,465],"field",{"name":459,"type":460},"complete","boolean",[437,462,463],{},"false"," if there are more than 50,000 documents and the list was cut off. ",[445,466,467],{},"Then do not delete anything based on it.",[457,469,472],{"name":470,"type":471},"documents[].checksum","string | null","SHA-256 of the current version. If yours differs, download the file again.",[457,474,477],{"name":475,"type":476},"documents[].categoryIds","uuid[]","Where it is filed, among the categories the key can see. This also catches a re-filing made in the CMS.",[441,479,480],{},[445,481,482],{},"Request",[484,485,490],"pre",{"className":486,"code":487,"language":488,"meta":489,"style":489},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync \\\n  -H \"Authorization: Bearer $DDM_API_KEY\"\n","bash","",[437,491,492,509],{"__ignoreMap":489},[493,494,497,501,505],"span",{"class":495,"line":496},"line",1,[493,498,500],{"class":499},"sBMFI","curl",[493,502,504],{"class":503},"sfazB"," https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync",[493,506,508],{"class":507},"sTEyZ"," \\\n",[493,510,512,515,519,522,525],{"class":495,"line":511},2,[493,513,514],{"class":503},"  -H",[493,516,518],{"class":517},"sMK4o"," \"",[493,520,521],{"class":503},"Authorization: Bearer ",[493,523,524],{"class":507},"$DDM_API_KEY",[493,526,527],{"class":517},"\"\n",[441,529,530,533,534],{},[445,531,532],{},"Response"," · ",[437,535,536],{},"200 OK",[484,538,542],{"className":539,"code":540,"language":541,"meta":489,"style":489},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"generatedAt\": \"2026-10-27T20:01:47.990Z\",\n  \"complete\": true,\n  \"documents\": [\n    {\n      \"id\": \"dc8594e0-0ead-4049-aaee-2ef899bcf76f\",\n      \"externalRef\": \"PIM-4711\",\n      \"sourceId\": \"5d02b7aa-5175-42e9-9277-aa19063833f2\",\n      \"status\": \"draft\",\n      \"currentVersionId\": \"1730e7bb-2f98-4761-aa9b-964c521351b3\",\n      \"checksum\": \"0bcb7c3b4886f699a985563d7bc9476bf75b4af35a57ff959f46c37e386cf54f\",\n      \"categoryIds\": [\n        \"078a554f-19a2-4285-b854-8546de01f815\"\n      ],\n      \"updatedAt\": \"2026-10-27T20:01:47.284Z\"\n    }\n  ],\n  \"categories\": [\n    {\n      \"id\": \"7a7afae0-f77b-478b-975d-d29eace15d51\",\n      \"parentId\": null,\n      \"externalRef\": \"CAT-10\",\n      \"updatedAt\": \"2026-10-27T20:01:46.086Z\"\n    },\n    {\n      \"id\": \"078a554f-19a2-4285-b854-8546de01f815\",\n      \"parentId\": \"7a7afae0-f77b-478b-975d-d29eace15d51\",\n      \"externalRef\": \"CAT-11\",\n      \"updatedAt\": \"2026-10-27T20:01:46.138Z\"\n    },\n    {\n      \"id\": \"45dc485e-d982-466a-8ab6-e8ac328b800f\",\n      \"parentId\": \"7a7afae0-f77b-478b-975d-d29eace15d51\",\n      \"externalRef\": null,\n      \"updatedAt\": \"2026-10-27T20:01:46.200Z\"\n    }\n  ]\n}\n","json",[437,543,544,549,574,588,603,609,631,652,673,694,715,736,750,761,767,786,792,798,812,817,837,852,872,890,896,901,920,939,959,977,982,987,1007,1026,1039,1057,1062,1068],{"__ignoreMap":489},[493,545,546],{"class":495,"line":496},[493,547,548],{"class":517},"{\n",[493,550,551,554,558,561,564,566,569,571],{"class":495,"line":511},[493,552,553],{"class":517},"  \"",[493,555,557],{"class":556},"spNyl","generatedAt",[493,559,560],{"class":517},"\"",[493,562,563],{"class":517},":",[493,565,518],{"class":517},[493,567,568],{"class":503},"2026-10-27T20:01:47.990Z",[493,570,560],{"class":517},[493,572,573],{"class":517},",\n",[493,575,577,579,581,583,585],{"class":495,"line":576},3,[493,578,553],{"class":517},[493,580,459],{"class":556},[493,582,560],{"class":517},[493,584,563],{"class":517},[493,586,587],{"class":517}," true,\n",[493,589,591,593,596,598,600],{"class":495,"line":590},4,[493,592,553],{"class":517},[493,594,595],{"class":556},"documents",[493,597,560],{"class":517},[493,599,563],{"class":517},[493,601,602],{"class":517}," [\n",[493,604,606],{"class":495,"line":605},5,[493,607,608],{"class":517},"    {\n",[493,610,612,615,618,620,622,624,627,629],{"class":495,"line":611},6,[493,613,614],{"class":517},"      \"",[493,616,617],{"class":499},"id",[493,619,560],{"class":517},[493,621,563],{"class":517},[493,623,518],{"class":517},[493,625,626],{"class":503},"dc8594e0-0ead-4049-aaee-2ef899bcf76f",[493,628,560],{"class":517},[493,630,573],{"class":517},[493,632,634,636,639,641,643,645,648,650],{"class":495,"line":633},7,[493,635,614],{"class":517},[493,637,638],{"class":499},"externalRef",[493,640,560],{"class":517},[493,642,563],{"class":517},[493,644,518],{"class":517},[493,646,647],{"class":503},"PIM-4711",[493,649,560],{"class":517},[493,651,573],{"class":517},[493,653,655,657,660,662,664,666,669,671],{"class":495,"line":654},8,[493,656,614],{"class":517},[493,658,659],{"class":499},"sourceId",[493,661,560],{"class":517},[493,663,563],{"class":517},[493,665,518],{"class":517},[493,667,668],{"class":503},"5d02b7aa-5175-42e9-9277-aa19063833f2",[493,670,560],{"class":517},[493,672,573],{"class":517},[493,674,676,678,681,683,685,687,690,692],{"class":495,"line":675},9,[493,677,614],{"class":517},[493,679,680],{"class":499},"status",[493,682,560],{"class":517},[493,684,563],{"class":517},[493,686,518],{"class":517},[493,688,689],{"class":503},"draft",[493,691,560],{"class":517},[493,693,573],{"class":517},[493,695,697,699,702,704,706,708,711,713],{"class":495,"line":696},10,[493,698,614],{"class":517},[493,700,701],{"class":499},"currentVersionId",[493,703,560],{"class":517},[493,705,563],{"class":517},[493,707,518],{"class":517},[493,709,710],{"class":503},"1730e7bb-2f98-4761-aa9b-964c521351b3",[493,712,560],{"class":517},[493,714,573],{"class":517},[493,716,718,720,723,725,727,729,732,734],{"class":495,"line":717},11,[493,719,614],{"class":517},[493,721,722],{"class":499},"checksum",[493,724,560],{"class":517},[493,726,563],{"class":517},[493,728,518],{"class":517},[493,730,731],{"class":503},"0bcb7c3b4886f699a985563d7bc9476bf75b4af35a57ff959f46c37e386cf54f",[493,733,560],{"class":517},[493,735,573],{"class":517},[493,737,739,741,744,746,748],{"class":495,"line":738},12,[493,740,614],{"class":517},[493,742,743],{"class":499},"categoryIds",[493,745,560],{"class":517},[493,747,563],{"class":517},[493,749,602],{"class":517},[493,751,753,756,759],{"class":495,"line":752},13,[493,754,755],{"class":517},"        \"",[493,757,758],{"class":503},"078a554f-19a2-4285-b854-8546de01f815",[493,760,527],{"class":517},[493,762,764],{"class":495,"line":763},14,[493,765,766],{"class":517},"      ],\n",[493,768,770,772,775,777,779,781,784],{"class":495,"line":769},15,[493,771,614],{"class":517},[493,773,774],{"class":499},"updatedAt",[493,776,560],{"class":517},[493,778,563],{"class":517},[493,780,518],{"class":517},[493,782,783],{"class":503},"2026-10-27T20:01:47.284Z",[493,785,527],{"class":517},[493,787,789],{"class":495,"line":788},16,[493,790,791],{"class":517},"    }\n",[493,793,795],{"class":495,"line":794},17,[493,796,797],{"class":517},"  ],\n",[493,799,801,803,806,808,810],{"class":495,"line":800},18,[493,802,553],{"class":517},[493,804,805],{"class":556},"categories",[493,807,560],{"class":517},[493,809,563],{"class":517},[493,811,602],{"class":517},[493,813,815],{"class":495,"line":814},19,[493,816,608],{"class":517},[493,818,820,822,824,826,828,830,833,835],{"class":495,"line":819},20,[493,821,614],{"class":517},[493,823,617],{"class":499},[493,825,560],{"class":517},[493,827,563],{"class":517},[493,829,518],{"class":517},[493,831,832],{"class":503},"7a7afae0-f77b-478b-975d-d29eace15d51",[493,834,560],{"class":517},[493,836,573],{"class":517},[493,838,840,842,845,847,849],{"class":495,"line":839},21,[493,841,614],{"class":517},[493,843,844],{"class":499},"parentId",[493,846,560],{"class":517},[493,848,563],{"class":517},[493,850,851],{"class":517}," null,\n",[493,853,855,857,859,861,863,865,868,870],{"class":495,"line":854},22,[493,856,614],{"class":517},[493,858,638],{"class":499},[493,860,560],{"class":517},[493,862,563],{"class":517},[493,864,518],{"class":517},[493,866,867],{"class":503},"CAT-10",[493,869,560],{"class":517},[493,871,573],{"class":517},[493,873,875,877,879,881,883,885,888],{"class":495,"line":874},23,[493,876,614],{"class":517},[493,878,774],{"class":499},[493,880,560],{"class":517},[493,882,563],{"class":517},[493,884,518],{"class":517},[493,886,887],{"class":503},"2026-10-27T20:01:46.086Z",[493,889,527],{"class":517},[493,891,893],{"class":495,"line":892},24,[493,894,895],{"class":517},"    },\n",[493,897,899],{"class":495,"line":898},25,[493,900,608],{"class":517},[493,902,904,906,908,910,912,914,916,918],{"class":495,"line":903},26,[493,905,614],{"class":517},[493,907,617],{"class":499},[493,909,560],{"class":517},[493,911,563],{"class":517},[493,913,518],{"class":517},[493,915,758],{"class":503},[493,917,560],{"class":517},[493,919,573],{"class":517},[493,921,923,925,927,929,931,933,935,937],{"class":495,"line":922},27,[493,924,614],{"class":517},[493,926,844],{"class":499},[493,928,560],{"class":517},[493,930,563],{"class":517},[493,932,518],{"class":517},[493,934,832],{"class":503},[493,936,560],{"class":517},[493,938,573],{"class":517},[493,940,942,944,946,948,950,952,955,957],{"class":495,"line":941},28,[493,943,614],{"class":517},[493,945,638],{"class":499},[493,947,560],{"class":517},[493,949,563],{"class":517},[493,951,518],{"class":517},[493,953,954],{"class":503},"CAT-11",[493,956,560],{"class":517},[493,958,573],{"class":517},[493,960,962,964,966,968,970,972,975],{"class":495,"line":961},29,[493,963,614],{"class":517},[493,965,774],{"class":499},[493,967,560],{"class":517},[493,969,563],{"class":517},[493,971,518],{"class":517},[493,973,974],{"class":503},"2026-10-27T20:01:46.138Z",[493,976,527],{"class":517},[493,978,980],{"class":495,"line":979},30,[493,981,895],{"class":517},[493,983,985],{"class":495,"line":984},31,[493,986,608],{"class":517},[493,988,990,992,994,996,998,1000,1003,1005],{"class":495,"line":989},32,[493,991,614],{"class":517},[493,993,617],{"class":499},[493,995,560],{"class":517},[493,997,563],{"class":517},[493,999,518],{"class":517},[493,1001,1002],{"class":503},"45dc485e-d982-466a-8ab6-e8ac328b800f",[493,1004,560],{"class":517},[493,1006,573],{"class":517},[493,1008,1010,1012,1014,1016,1018,1020,1022,1024],{"class":495,"line":1009},33,[493,1011,614],{"class":517},[493,1013,844],{"class":499},[493,1015,560],{"class":517},[493,1017,563],{"class":517},[493,1019,518],{"class":517},[493,1021,832],{"class":503},[493,1023,560],{"class":517},[493,1025,573],{"class":517},[493,1027,1029,1031,1033,1035,1037],{"class":495,"line":1028},34,[493,1030,614],{"class":517},[493,1032,638],{"class":499},[493,1034,560],{"class":517},[493,1036,563],{"class":517},[493,1038,851],{"class":517},[493,1040,1042,1044,1046,1048,1050,1052,1055],{"class":495,"line":1041},35,[493,1043,614],{"class":517},[493,1045,774],{"class":499},[493,1047,560],{"class":517},[493,1049,563],{"class":517},[493,1051,518],{"class":517},[493,1053,1054],{"class":503},"2026-10-27T20:01:46.200Z",[493,1056,527],{"class":517},[493,1058,1060],{"class":495,"line":1059},36,[493,1061,791],{"class":517},[493,1063,1065],{"class":495,"line":1064},37,[493,1066,1067],{"class":517},"  ]\n",[493,1069,1071],{"class":495,"line":1070},38,[493,1072,1073],{"class":517},"}\n",[1075,1076],"api-try",{"method":1077,"path":1078},"GET","\u002Fsync",[433,1080,1082],{"id":1081},"example-finding-deleted-documents","Example: finding deleted documents",[441,1084,1085,1086,1088,1089,1091],{},"Keep the manifest of each run. On the next run, fetch a new one and compare: every ",[437,1087,617],{}," that was in the old one and is missing from the new one is ",[445,1090,451],{}," for this key. The document may have been deleted, archived out of the released view, or moved where the key's person cannot see it.",[1093,1094,1095,1358,1822,1953],"code-group",{},[484,1096,1099],{"className":486,"code":1097,"filename":1098,"language":488,"meta":489,"style":489},"# The manifest of the last run is in manifest-previous.json.\ncurl -s https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync \\\n  -H \"Authorization: Bearer $DDM_API_KEY\" > manifest.json\n\n# Cut off above 50,000 documents? Then compare nothing.\nif [ \"$(jq .complete manifest.json)\" != \"true\" ]; then\n  echo \"Manifest incomplete – not deleting anything\" >&2; exit 1\nfi\n\n# The ids that were there last time and are not any more.\njq -r '.documents[].id' manifest-previous.json | sort > previous.txt\njq -r '.documents[].id' manifest.json | sort > current.txt\ncomm -23 previous.txt current.txt > gone.txt\n\nwhile read -r id; do\n  echo \"gone: $id\"   # remove it from your system here\ndone \u003C gone.txt\n\nmv manifest.json manifest-previous.json\n","curl + jq",[437,1100,1101,1107,1118,1136,1142,1147,1184,1207,1212,1216,1221,1251,1275,1294,1298,1317,1334,1344,1348],{"__ignoreMap":489},[493,1102,1103],{"class":495,"line":496},[493,1104,1106],{"class":1105},"sHwdD","# The manifest of the last run is in manifest-previous.json.\n",[493,1108,1109,1111,1114,1116],{"class":495,"line":511},[493,1110,500],{"class":499},[493,1112,1113],{"class":503}," -s",[493,1115,504],{"class":503},[493,1117,508],{"class":507},[493,1119,1120,1122,1124,1126,1128,1130,1133],{"class":495,"line":576},[493,1121,514],{"class":503},[493,1123,518],{"class":517},[493,1125,521],{"class":503},[493,1127,524],{"class":507},[493,1129,560],{"class":517},[493,1131,1132],{"class":517}," >",[493,1134,1135],{"class":503}," manifest.json\n",[493,1137,1138],{"class":495,"line":590},[493,1139,1141],{"emptyLinePlaceholder":1140},true,"\n",[493,1143,1144],{"class":495,"line":605},[493,1145,1146],{"class":1105},"# Cut off above 50,000 documents? Then compare nothing.\n",[493,1148,1149,1153,1156,1159,1162,1165,1168,1171,1173,1176,1178,1181],{"class":495,"line":611},[493,1150,1152],{"class":1151},"s7zQu","if",[493,1154,1155],{"class":517}," [",[493,1157,1158],{"class":517}," \"$(",[493,1160,1161],{"class":499},"jq",[493,1163,1164],{"class":503}," .complete manifest.json",[493,1166,1167],{"class":517},")\"",[493,1169,1170],{"class":517}," !=",[493,1172,518],{"class":517},[493,1174,1175],{"class":503},"true",[493,1177,560],{"class":517},[493,1179,1180],{"class":517}," ];",[493,1182,1183],{"class":1151}," then\n",[493,1185,1186,1190,1192,1195,1197,1200,1203],{"class":495,"line":633},[493,1187,1189],{"class":1188},"s2Zo4","  echo",[493,1191,518],{"class":517},[493,1193,1194],{"class":503},"Manifest incomplete – not deleting anything",[493,1196,560],{"class":517},[493,1198,1199],{"class":517}," >&2;",[493,1201,1202],{"class":1188}," exit",[493,1204,1206],{"class":1205},"sbssI"," 1\n",[493,1208,1209],{"class":495,"line":654},[493,1210,1211],{"class":1151},"fi\n",[493,1213,1214],{"class":495,"line":675},[493,1215,1141],{"emptyLinePlaceholder":1140},[493,1217,1218],{"class":495,"line":696},[493,1219,1220],{"class":1105},"# The ids that were there last time and are not any more.\n",[493,1222,1223,1225,1228,1231,1234,1237,1240,1243,1246,1248],{"class":495,"line":717},[493,1224,1161],{"class":499},[493,1226,1227],{"class":503}," -r",[493,1229,1230],{"class":517}," '",[493,1232,1233],{"class":503},".documents[].id",[493,1235,1236],{"class":517},"'",[493,1238,1239],{"class":503}," manifest-previous.json",[493,1241,1242],{"class":517}," |",[493,1244,1245],{"class":499}," sort",[493,1247,1132],{"class":517},[493,1249,1250],{"class":503}," previous.txt\n",[493,1252,1253,1255,1257,1259,1261,1263,1266,1268,1270,1272],{"class":495,"line":738},[493,1254,1161],{"class":499},[493,1256,1227],{"class":503},[493,1258,1230],{"class":517},[493,1260,1233],{"class":503},[493,1262,1236],{"class":517},[493,1264,1265],{"class":503}," manifest.json",[493,1267,1242],{"class":517},[493,1269,1245],{"class":499},[493,1271,1132],{"class":517},[493,1273,1274],{"class":503}," current.txt\n",[493,1276,1277,1280,1283,1286,1289,1291],{"class":495,"line":752},[493,1278,1279],{"class":499},"comm",[493,1281,1282],{"class":503}," -23",[493,1284,1285],{"class":503}," previous.txt",[493,1287,1288],{"class":503}," current.txt",[493,1290,1132],{"class":517},[493,1292,1293],{"class":503}," gone.txt\n",[493,1295,1296],{"class":495,"line":763},[493,1297,1141],{"emptyLinePlaceholder":1140},[493,1299,1300,1303,1306,1308,1311,1314],{"class":495,"line":769},[493,1301,1302],{"class":1151},"while",[493,1304,1305],{"class":1188}," read",[493,1307,1227],{"class":503},[493,1309,1310],{"class":503}," id",[493,1312,1313],{"class":517},";",[493,1315,1316],{"class":1151}," do\n",[493,1318,1319,1321,1323,1326,1329,1331],{"class":495,"line":788},[493,1320,1189],{"class":1188},[493,1322,518],{"class":517},[493,1324,1325],{"class":503},"gone: ",[493,1327,1328],{"class":507},"$id",[493,1330,560],{"class":517},[493,1332,1333],{"class":1105},"   # remove it from your system here\n",[493,1335,1336,1339,1342],{"class":495,"line":794},[493,1337,1338],{"class":1151},"done",[493,1340,1341],{"class":517}," \u003C",[493,1343,1293],{"class":507},[493,1345,1346],{"class":495,"line":800},[493,1347,1141],{"emptyLinePlaceholder":1140},[493,1349,1350,1353,1355],{"class":495,"line":814},[493,1351,1352],{"class":499},"mv",[493,1354,1265],{"class":503},[493,1356,1357],{"class":503}," manifest-previous.json\n",[484,1359,1364],{"className":1360,"code":1361,"filename":1362,"language":1363,"meta":489,"style":489},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { readFile, writeFile } from 'node:fs\u002Fpromises'\n\nconst response = await fetch('https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync', {\n  headers: { Authorization: `Bearer ${process.env.DDM_API_KEY}` }\n})\nconst manifest = await response.json()\n\n\u002F\u002F Cut off above 50,000 documents? Then compare nothing.\nif (!manifest.complete) throw new Error('Manifest incomplete – not deleting anything')\n\nconst previous = JSON.parse(await readFile('manifest-previous.json', 'utf8').catch(() => '{\"documents\":[]}'))\nconst present = new Set(manifest.documents.map(document => document.id))\nconst gone = previous.documents.filter(document => !present.has(document.id))\n\nfor (const document of gone) {\n  \u002F\u002F externalRef is set for documents that came from a push – often the id your system knows.\n  console.log('gone:', document.id, document.externalRef ?? '')\n  \u002F\u002F remove it from your system here\n}\n\nawait writeFile('manifest-previous.json', JSON.stringify(manifest))\n","JavaScript","js",[437,1365,1366,1397,1401,1433,1477,1485,1506,1510,1515,1552,1556,1624,1666,1711,1715,1735,1740,1783,1788,1792,1796],{"__ignoreMap":489},[493,1367,1368,1371,1374,1377,1380,1383,1386,1389,1391,1394],{"class":495,"line":496},[493,1369,1370],{"class":1151},"import",[493,1372,1373],{"class":517}," {",[493,1375,1376],{"class":507}," readFile",[493,1378,1379],{"class":517},",",[493,1381,1382],{"class":507}," writeFile",[493,1384,1385],{"class":517}," }",[493,1387,1388],{"class":1151}," from",[493,1390,1230],{"class":517},[493,1392,1393],{"class":503},"node:fs\u002Fpromises",[493,1395,1396],{"class":517},"'\n",[493,1398,1399],{"class":495,"line":511},[493,1400,1141],{"emptyLinePlaceholder":1140},[493,1402,1403,1406,1409,1412,1415,1418,1421,1423,1426,1428,1430],{"class":495,"line":576},[493,1404,1405],{"class":556},"const",[493,1407,1408],{"class":507}," response ",[493,1410,1411],{"class":517},"=",[493,1413,1414],{"class":1151}," await",[493,1416,1417],{"class":1188}," fetch",[493,1419,1420],{"class":507},"(",[493,1422,1236],{"class":517},[493,1424,1425],{"class":503},"https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync",[493,1427,1236],{"class":517},[493,1429,1379],{"class":517},[493,1431,1432],{"class":517}," {\n",[493,1434,1435,1439,1441,1443,1446,1448,1451,1454,1457,1460,1463,1466,1468,1471,1474],{"class":495,"line":590},[493,1436,1438],{"class":1437},"swJcz","  headers",[493,1440,563],{"class":517},[493,1442,1373],{"class":517},[493,1444,1445],{"class":1437}," Authorization",[493,1447,563],{"class":517},[493,1449,1450],{"class":517}," `",[493,1452,1453],{"class":503},"Bearer ",[493,1455,1456],{"class":517},"${",[493,1458,1459],{"class":507},"process",[493,1461,1462],{"class":517},".",[493,1464,1465],{"class":507},"env",[493,1467,1462],{"class":517},[493,1469,1470],{"class":507},"DDM_API_KEY",[493,1472,1473],{"class":517},"}`",[493,1475,1476],{"class":517}," }\n",[493,1478,1479,1482],{"class":495,"line":605},[493,1480,1481],{"class":517},"}",[493,1483,1484],{"class":507},")\n",[493,1486,1487,1489,1492,1494,1496,1499,1501,1503],{"class":495,"line":611},[493,1488,1405],{"class":556},[493,1490,1491],{"class":507}," manifest ",[493,1493,1411],{"class":517},[493,1495,1414],{"class":1151},[493,1497,1498],{"class":507}," response",[493,1500,1462],{"class":517},[493,1502,541],{"class":1188},[493,1504,1505],{"class":507},"()\n",[493,1507,1508],{"class":495,"line":633},[493,1509,1141],{"emptyLinePlaceholder":1140},[493,1511,1512],{"class":495,"line":654},[493,1513,1514],{"class":1105},"\u002F\u002F Cut off above 50,000 documents? Then compare nothing.\n",[493,1516,1517,1519,1522,1525,1528,1530,1533,1536,1539,1542,1544,1546,1548,1550],{"class":495,"line":675},[493,1518,1152],{"class":1151},[493,1520,1521],{"class":507}," (",[493,1523,1524],{"class":517},"!",[493,1526,1527],{"class":507},"manifest",[493,1529,1462],{"class":517},[493,1531,1532],{"class":507},"complete) ",[493,1534,1535],{"class":1151},"throw",[493,1537,1538],{"class":517}," new",[493,1540,1541],{"class":1188}," Error",[493,1543,1420],{"class":507},[493,1545,1236],{"class":517},[493,1547,1194],{"class":503},[493,1549,1236],{"class":517},[493,1551,1484],{"class":507},[493,1553,1554],{"class":495,"line":696},[493,1555,1141],{"emptyLinePlaceholder":1140},[493,1557,1558,1560,1563,1565,1568,1570,1573,1575,1578,1580,1582,1584,1587,1589,1591,1593,1596,1598,1601,1603,1606,1608,1611,1614,1616,1619,1621],{"class":495,"line":717},[493,1559,1405],{"class":556},[493,1561,1562],{"class":507}," previous ",[493,1564,1411],{"class":517},[493,1566,1567],{"class":507}," JSON",[493,1569,1462],{"class":517},[493,1571,1572],{"class":1188},"parse",[493,1574,1420],{"class":507},[493,1576,1577],{"class":1151},"await",[493,1579,1376],{"class":1188},[493,1581,1420],{"class":507},[493,1583,1236],{"class":517},[493,1585,1586],{"class":503},"manifest-previous.json",[493,1588,1236],{"class":517},[493,1590,1379],{"class":517},[493,1592,1230],{"class":517},[493,1594,1595],{"class":503},"utf8",[493,1597,1236],{"class":517},[493,1599,1600],{"class":507},")",[493,1602,1462],{"class":517},[493,1604,1605],{"class":1188},"catch",[493,1607,1420],{"class":507},[493,1609,1610],{"class":517},"()",[493,1612,1613],{"class":556}," =>",[493,1615,1230],{"class":517},[493,1617,1618],{"class":503},"{\"documents\":[]}",[493,1620,1236],{"class":517},[493,1622,1623],{"class":507},"))\n",[493,1625,1626,1628,1631,1633,1635,1638,1641,1643,1645,1647,1650,1652,1656,1658,1661,1663],{"class":495,"line":738},[493,1627,1405],{"class":556},[493,1629,1630],{"class":507}," present ",[493,1632,1411],{"class":517},[493,1634,1538],{"class":517},[493,1636,1637],{"class":1188}," Set",[493,1639,1640],{"class":507},"(manifest",[493,1642,1462],{"class":517},[493,1644,595],{"class":507},[493,1646,1462],{"class":517},[493,1648,1649],{"class":1188},"map",[493,1651,1420],{"class":507},[493,1653,1655],{"class":1654},"sHdIc","document",[493,1657,1613],{"class":556},[493,1659,1660],{"class":507}," document",[493,1662,1462],{"class":517},[493,1664,1665],{"class":507},"id))\n",[493,1667,1668,1670,1673,1675,1678,1680,1682,1684,1687,1689,1691,1693,1696,1699,1701,1704,1707,1709],{"class":495,"line":752},[493,1669,1405],{"class":556},[493,1671,1672],{"class":507}," gone ",[493,1674,1411],{"class":517},[493,1676,1677],{"class":507}," previous",[493,1679,1462],{"class":517},[493,1681,595],{"class":507},[493,1683,1462],{"class":517},[493,1685,1686],{"class":1188},"filter",[493,1688,1420],{"class":507},[493,1690,1655],{"class":1654},[493,1692,1613],{"class":556},[493,1694,1695],{"class":517}," !",[493,1697,1698],{"class":507},"present",[493,1700,1462],{"class":517},[493,1702,1703],{"class":1188},"has",[493,1705,1706],{"class":507},"(document",[493,1708,1462],{"class":517},[493,1710,1665],{"class":507},[493,1712,1713],{"class":495,"line":763},[493,1714,1141],{"emptyLinePlaceholder":1140},[493,1716,1717,1720,1722,1724,1727,1730,1733],{"class":495,"line":769},[493,1718,1719],{"class":1151},"for",[493,1721,1521],{"class":507},[493,1723,1405],{"class":556},[493,1725,1726],{"class":507}," document ",[493,1728,1729],{"class":517},"of",[493,1731,1732],{"class":507}," gone) ",[493,1734,548],{"class":517},[493,1736,1737],{"class":495,"line":788},[493,1738,1739],{"class":1105},"  \u002F\u002F externalRef is set for documents that came from a push – often the id your system knows.\n",[493,1741,1742,1745,1747,1750,1752,1754,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1778,1781],{"class":495,"line":794},[493,1743,1744],{"class":507},"  console",[493,1746,1462],{"class":517},[493,1748,1749],{"class":1188},"log",[493,1751,1420],{"class":1437},[493,1753,1236],{"class":517},[493,1755,1756],{"class":503},"gone:",[493,1758,1236],{"class":517},[493,1760,1379],{"class":517},[493,1762,1660],{"class":507},[493,1764,1462],{"class":517},[493,1766,617],{"class":507},[493,1768,1379],{"class":517},[493,1770,1660],{"class":507},[493,1772,1462],{"class":517},[493,1774,638],{"class":507},[493,1776,1777],{"class":517}," ??",[493,1779,1780],{"class":517}," ''",[493,1782,1484],{"class":1437},[493,1784,1785],{"class":495,"line":800},[493,1786,1787],{"class":1105},"  \u002F\u002F remove it from your system here\n",[493,1789,1790],{"class":495,"line":814},[493,1791,1073],{"class":517},[493,1793,1794],{"class":495,"line":819},[493,1795,1141],{"emptyLinePlaceholder":1140},[493,1797,1798,1800,1802,1804,1806,1808,1810,1812,1814,1816,1819],{"class":495,"line":839},[493,1799,1577],{"class":1151},[493,1801,1382],{"class":1188},[493,1803,1420],{"class":507},[493,1805,1236],{"class":517},[493,1807,1586],{"class":503},[493,1809,1236],{"class":517},[493,1811,1379],{"class":517},[493,1813,1567],{"class":507},[493,1815,1462],{"class":517},[493,1817,1818],{"class":1188},"stringify",[493,1820,1821],{"class":507},"(manifest))\n",[484,1823,1828],{"className":1824,"code":1825,"filename":1826,"language":1827,"meta":489,"style":489},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import json, os, requests\n\nmanifest = requests.get(\n    \"https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync\",\n    headers={\"Authorization\": f\"Bearer {os.environ['DDM_API_KEY']}\"},\n).json()\n\n# Cut off above 50,000 documents? Then compare nothing.\nif not manifest[\"complete\"]:\n    raise SystemExit(\"Manifest incomplete – not deleting anything\")\n\ntry:\n    with open(\"manifest-previous.json\") as file:\n        previous = json.load(file)\nexcept FileNotFoundError:\n    previous = {\"documents\": []}\n\npresent = {document[\"id\"] for document in manifest[\"documents\"]}\ngone = [document for document in previous[\"documents\"] if document[\"id\"] not in present]\n\nfor document in gone:\n    print(\"gone:\", document[\"id\"], document.get(\"externalRef\") or \"\")\n    # remove it from your system here\n\nwith open(\"manifest-previous.json\", \"w\") as file:\n    json.dump(manifest, file)\n","Python","python",[437,1829,1830,1835,1839,1844,1849,1854,1859,1863,1867,1872,1877,1881,1886,1891,1896,1901,1906,1910,1915,1920,1924,1929,1934,1939,1943,1948],{"__ignoreMap":489},[493,1831,1832],{"class":495,"line":496},[493,1833,1834],{},"import json, os, requests\n",[493,1836,1837],{"class":495,"line":511},[493,1838,1141],{"emptyLinePlaceholder":1140},[493,1840,1841],{"class":495,"line":576},[493,1842,1843],{},"manifest = requests.get(\n",[493,1845,1846],{"class":495,"line":590},[493,1847,1848],{},"    \"https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync\",\n",[493,1850,1851],{"class":495,"line":605},[493,1852,1853],{},"    headers={\"Authorization\": f\"Bearer {os.environ['DDM_API_KEY']}\"},\n",[493,1855,1856],{"class":495,"line":611},[493,1857,1858],{},").json()\n",[493,1860,1861],{"class":495,"line":633},[493,1862,1141],{"emptyLinePlaceholder":1140},[493,1864,1865],{"class":495,"line":654},[493,1866,1146],{},[493,1868,1869],{"class":495,"line":675},[493,1870,1871],{},"if not manifest[\"complete\"]:\n",[493,1873,1874],{"class":495,"line":696},[493,1875,1876],{},"    raise SystemExit(\"Manifest incomplete – not deleting anything\")\n",[493,1878,1879],{"class":495,"line":717},[493,1880,1141],{"emptyLinePlaceholder":1140},[493,1882,1883],{"class":495,"line":738},[493,1884,1885],{},"try:\n",[493,1887,1888],{"class":495,"line":752},[493,1889,1890],{},"    with open(\"manifest-previous.json\") as file:\n",[493,1892,1893],{"class":495,"line":763},[493,1894,1895],{},"        previous = json.load(file)\n",[493,1897,1898],{"class":495,"line":769},[493,1899,1900],{},"except FileNotFoundError:\n",[493,1902,1903],{"class":495,"line":788},[493,1904,1905],{},"    previous = {\"documents\": []}\n",[493,1907,1908],{"class":495,"line":794},[493,1909,1141],{"emptyLinePlaceholder":1140},[493,1911,1912],{"class":495,"line":800},[493,1913,1914],{},"present = {document[\"id\"] for document in manifest[\"documents\"]}\n",[493,1916,1917],{"class":495,"line":814},[493,1918,1919],{},"gone = [document for document in previous[\"documents\"] if document[\"id\"] not in present]\n",[493,1921,1922],{"class":495,"line":819},[493,1923,1141],{"emptyLinePlaceholder":1140},[493,1925,1926],{"class":495,"line":839},[493,1927,1928],{},"for document in gone:\n",[493,1930,1931],{"class":495,"line":854},[493,1932,1933],{},"    print(\"gone:\", document[\"id\"], document.get(\"externalRef\") or \"\")\n",[493,1935,1936],{"class":495,"line":874},[493,1937,1938],{},"    # remove it from your system here\n",[493,1940,1941],{"class":495,"line":892},[493,1942,1141],{"emptyLinePlaceholder":1140},[493,1944,1945],{"class":495,"line":898},[493,1946,1947],{},"with open(\"manifest-previous.json\", \"w\") as file:\n",[493,1949,1950],{"class":495,"line":903},[493,1951,1952],{},"    json.dump(manifest, file)\n",[484,1954,1959],{"className":1955,"code":1956,"filename":1957,"language":1958,"meta":489,"style":489},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$headers = @{ Authorization = \"Bearer $env:DDM_API_KEY\" }\n$manifest = Invoke-RestMethod -Uri \"https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync\" -Headers $headers\n\n# Cut off above 50,000 documents? Then compare nothing.\nif (-not $manifest.complete) { throw \"Manifest incomplete – not deleting anything\" }\n\n$previous = if (Test-Path manifest-previous.json) { Get-Content manifest-previous.json -Raw | ConvertFrom-Json } else { @{ documents = @() } }\n$present = [System.Collections.Generic.HashSet[string]]::new([string[]]$manifest.documents.id)\n\nforeach ($document in $previous.documents) {\n  if (-not $present.Contains($document.id)) {\n    Write-Output \"gone: $($document.id) $($document.externalRef)\"\n    # remove it from your system here\n  }\n}\n\n$manifest | ConvertTo-Json -Depth 5 | Set-Content manifest-previous.json\n","PowerShell","powershell",[437,1960,1961,1966,1971,1975,1979,1984,1988,1993,1998,2002,2007,2012,2017,2021,2026,2030,2034],{"__ignoreMap":489},[493,1962,1963],{"class":495,"line":496},[493,1964,1965],{},"$headers = @{ Authorization = \"Bearer $env:DDM_API_KEY\" }\n",[493,1967,1968],{"class":495,"line":511},[493,1969,1970],{},"$manifest = Invoke-RestMethod -Uri \"https:\u002F\u002Fddm.example.com\u002Fapi\u002Fext\u002Fv1\u002Fsync\" -Headers $headers\n",[493,1972,1973],{"class":495,"line":576},[493,1974,1141],{"emptyLinePlaceholder":1140},[493,1976,1977],{"class":495,"line":590},[493,1978,1146],{},[493,1980,1981],{"class":495,"line":605},[493,1982,1983],{},"if (-not $manifest.complete) { throw \"Manifest incomplete – not deleting anything\" }\n",[493,1985,1986],{"class":495,"line":611},[493,1987,1141],{"emptyLinePlaceholder":1140},[493,1989,1990],{"class":495,"line":633},[493,1991,1992],{},"$previous = if (Test-Path manifest-previous.json) { Get-Content manifest-previous.json -Raw | ConvertFrom-Json } else { @{ documents = @() } }\n",[493,1994,1995],{"class":495,"line":654},[493,1996,1997],{},"$present = [System.Collections.Generic.HashSet[string]]::new([string[]]$manifest.documents.id)\n",[493,1999,2000],{"class":495,"line":675},[493,2001,1141],{"emptyLinePlaceholder":1140},[493,2003,2004],{"class":495,"line":696},[493,2005,2006],{},"foreach ($document in $previous.documents) {\n",[493,2008,2009],{"class":495,"line":717},[493,2010,2011],{},"  if (-not $present.Contains($document.id)) {\n",[493,2013,2014],{"class":495,"line":738},[493,2015,2016],{},"    Write-Output \"gone: $($document.id) $($document.externalRef)\"\n",[493,2018,2019],{"class":495,"line":752},[493,2020,1938],{},[493,2022,2023],{"class":495,"line":763},[493,2024,2025],{},"  }\n",[493,2027,2028],{"class":495,"line":769},[493,2029,1073],{},[493,2031,2032],{"class":495,"line":788},[493,2033,1141],{"emptyLinePlaceholder":1140},[493,2035,2036],{"class":495,"line":794},[493,2037,2038],{},"$manifest | ConvertTo-Json -Depth 5 | Set-Content manifest-previous.json\n",[441,2040,2041,2042,2046,2047,2050,2051,2054,2055,2057,2058,2060],{},"What \"gone\" means is the same in all three cases: remove the document from your system, or hide it there. If you need to know ",[2043,2044,2045],"em",{},"why"," it is gone, ask ",[437,2048,2049],{},"GET \u002Fdocuments\u002F{id}"," with a key that sees everything. ",[437,2052,2053],{},"404"," means it was deleted; otherwise its ",[437,2056,680],{}," and ",[437,2059,743],{}," tell you what changed.",[2062,2063,2064,2065,2067,2068,2070,2071,2074],"warning",{},"Only compare a manifest whose ",[437,2066,459],{}," is ",[437,2069,1175],{},". And treat a manifest that is suddenly ",[445,2072,2073],{},"empty or much smaller"," with suspicion – a revoked permission or a changed acting person makes everything \"disappear\" at once. A sensible guard: stop and alert someone if more than, say, 10 % of documents would be deleted in one run.",[433,2076,2078],{"id":2077},"change-feed-or-manifest","Change feed or manifest?",[2080,2081,2082,2095],"table",{},[2083,2084,2085],"thead",{},[2086,2087,2088,2092],"tr",{},[2089,2090,2091],"th",{},"Question",[2089,2093,2094],{},"Use",[2096,2097,2098,2110,2120],"tbody",{},[2086,2099,2100,2104],{},[2101,2102,2103],"td",{},"What is new or changed since my last run?",[2101,2105,2106,2109],{},[437,2107,2108],{},"GET \u002Fdocuments?updatedSince=…"," – small, fast, paged",[2086,2111,2112,2115],{},[2101,2113,2114],{},"What is gone?",[2101,2116,2117,2119],{},[437,2118,439],{}," – complete, but larger",[2086,2121,2122,2125],{},[2101,2123,2124],{},"Has anything been re-filed or re-tagged in the CMS?",[2101,2126,2127,2129,2130,2132],{},[437,2128,439],{}," for the filing, ",[437,2131,2049],{}," for the tags",[441,2134,2135],{},"A good rhythm: the change feed every few minutes, and the manifest once an hour or once a night.",[2137,2138,2139],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":489,"searchDepth":511,"depth":511,"links":2141},[2142,2143,2144],{"id":435,"depth":511,"text":439},{"id":1081,"depth":511,"text":1082},{"id":2077,"depth":511,"text":2078},"GET \u002Fsync – everything a key can see in one list, to find what was deleted.","md",null,{},{"icon":211},{"title":347,"description":2145},"XPNH7DWzGRpnX080KVGIp4WLoTivgvVsxwC9W8chP5c",[2153,2155],{"title":342,"path":343,"stem":344,"description":2154,"icon":345,"children":-1},"The category endpoints, and the tags and markets documents and categories refer to.",{"title":351,"path":352,"stem":353,"description":2156,"icon":309,"children":-1},"The machine-readable description of the API – for Postman, Insomnia and client generators.",1793617722548]