Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.
Requires write:photos. Accepts up to 100 photos per request.Upload the files with POST /builders/{builderId}/attachments/bulk-upload, then pass each returned attachment reference as photos[].imageAttachment.
Photo reports: omit folderId and folderName. Use the returned att_ attachment IDs in the photo report.
Gallery folders: provide projectId and a folderName, or reuse an existing folderId.
Each photo returns a CREATED, EXISTING or FAILED result. Keep external source IDs stable when retrying to avoid duplicates. URL imports require an HTTPS host approved by BuildPass.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"BuildPass API","colors":{"primary":"#68d07f","light":"#68d07f","dark":"#68d07f"},"favicon":"https://mintcdn.com/buildpass/Xsjs4NKNLPoM6N4X/favicon.svg?fit=max\u0026auto=format\u0026n=Xsjs4NKNLPoM6N4X\u0026q=85\u0026s=277fce044fd6d8a12d6a617a5bf8a5a2","logo":{"light":"https://mintcdn.com/buildpass/Cb9JmQTwpkItOpus/logo/light.svg?fit=max\u0026auto=format\u0026n=Cb9JmQTwpkItOpus\u0026q=85\u0026s=318747a7e7df24c220865cf82aa2bb95","dark":"https://mintcdn.com/buildpass/Cb9JmQTwpkItOpus/logo/dark.svg?fit=max\u0026auto=format\u0026n=Cb9JmQTwpkItOpus\u0026q=85\u0026s=9625f6216d72a5151785bedf260ae509"},"navbar":{"links":[{"label":"Support","href":"mailto:support@buildpass.com.au"}],"primary":{"type":"button","label":"Log in","href":"https://app.buildpass.com.au"}},"footer":{"socials":{}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"buildpass","hasAudioNarration":false,"actualSubdomain":"buildpass","customDomains":["developer.buildpass.global"],"gitSource":{"type":"github","owner":"buildpass-au","repo":"external-api","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ac59da54e1548e7873f3388","collectionId":"cbefca5f-c040-48fb-bace-4a48dcbd3152","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ac59da54e1548e7873f3388"},"entitlements":{},"buildId":"6ac59da54e1548e7873f3388","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"API Reference","count":49},{"language":"default","tag":"Photos","count":12},{"language":"default","tag":"Documentation","count":9},{"language":"default","tag":"Meetings","count":8},{"language":"default","tag":"Features","count":7},{"language":"default","tag":"Subcontractors","count":4},{"language":"default","tag":"Timesheets","count":4},{"language":"default","tag":"Attachments","count":3},{"language":"default","tag":"Inductions","count":3},{"language":"default","tag":"Defects","count":2}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"a.group[href=\"https://app.buildpass.com.au\"]>div>svg{display:none}a.group[href=\"https://app.buildpass.com.au\"]>div{margin-right:0}"}],"page":{"pagePath":"api-reference/builders/photo-gallery/bulk-upsert","slug":"/api-reference/builders/photo-gallery/bulk-upsert","pageMetadata":{"title":"Bulk upsert photos","openapi":"POST /builders/{builderId}/photo-gallery/bulk-upsert","description":"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.","href":"/api-reference/builders/photo-gallery/bulk-upsert"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components};return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Requires `,_jsx(_components.code,{children:`write:photos`}),`. Accepts up to 100 photos per request.`]}),`\n`,_jsxs(_components.p,{children:[`Upload the files with `,_jsx(_components.code,{children:`POST /builders/{builderId}/attachments/bulk-upload`}),`, then pass each returned attachment reference as `,_jsx(_components.code,{children:`photos[].imageAttachment`}),`.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Photo reports:`}),` omit `,_jsx(_components.code,{children:`folderId`}),` and `,_jsx(_components.code,{children:`folderName`}),`. Use the returned `,_jsx(_components.code,{children:`att_`}),` attachment IDs in the `,_jsx(_components.a,{href:`/api-reference/builders/photo-reports/sync`,children:`photo report`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Gallery folders:`}),` provide `,_jsx(_components.code,{children:`projectId`}),` and a `,_jsx(_components.code,{children:`folderName`}),`, or reuse an existing `,_jsx(_components.code,{children:`folderId`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Each photo returns a `,_jsx(_components.code,{children:`CREATED`}),`, `,_jsx(_components.code,{children:`EXISTING`}),` or `,_jsx(_components.code,{children:`FAILED`}),` result. Keep external source IDs stable when retrying to avoid duplicates. URL imports require an HTTPS host approved by BuildPass.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Bulk upsert photos","openapi":"POST /builders/{builderId}/photo-gallery/bulk-upsert","description":"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.","href":"/api-reference/builders/photo-gallery/bulk-upsert"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/buildpass/a6a67761c3b7e458/script.js"],"openApiReferenceData":{"operation":{"summary":"Bulk upsert photos","description":"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.","tags":["Photos"],"parameters":["68e76965-28ac-40bd-9284-3338aff913f7"],"requestBody":"8b714be1-260c-43b5-82e2-181620edcf48","responses":{"200":"f1957822-9f3e-4e01-9ab3-5ae66d9f1d87"},"security":["82f60164-cefe-4313-956e-f9a06b30dd27"],"method":"post","type":"path","servers":["5387ed31-b1f0-4d15-a199-19356eb085b4"],"path":"/builders/{builderId}/photo-gallery/bulk-upsert","baseUrlOptions":["https://api.buildpass.global"],"title":"Bulk upsert photos","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"68e76965-28ac-40bd-9284-3338aff913f7":{"name":"builderId","in":"path","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["externalSourceId","photos"],"properties":{"externalSourceId":{"type":"string","example":"example-integrator:photo-page:page_123","description":"Stable ID for this group of photos in your application. For photo reports, use the report’s sourceExternalId.","isRequired":true,"uniqueKey":"externalSourceId","typeLabel":"string"},"photos":{"type":"array","items":{"oneOf":[{"type":"object","required":["externalSourceId","fileName","sequenceId","imageAttachment"],"properties":{"externalSourceId":{"type":"string","description":"Stable ID for this photo in your application. For photo reports, use the image block’s sourceBlockId.","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.0.externalSourceId","typeLabel":"string"},"imageAttachment":{"type":"object","required":["key","type"],"properties":{"key":{"type":"string","example":"external-uploads/ckbuilder123456789012345678/photo.jpg","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.0.imageAttachment.key","typeLabel":"string"},"type":{"type":"string","enum":["attachment"],"isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.0.imageAttachment.type","typeLabel":"enum\u003cstring>"},"regionId":{"oneOf":[{"type":"string","example":"au1","uniqueKey":"photos.items.[INDEX].oneOf.0.imageAttachment.regionId.oneOf.0","typeLabel":"string"},{"type":"null","example":"au1","uniqueKey":"photos.items.[INDEX].oneOf.0.imageAttachment.regionId.oneOf.1","typeLabel":"null"}],"uniqueKey":"photos.items.[INDEX].oneOf.0.imageAttachment.regionId","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.0.imageAttachment","typeLabel":"object"},"fileName":{"type":"string","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.0.fileName","typeLabel":"string"},"sequenceId":{"type":"number","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.0.sequenceId","typeLabel":"number"},"imageUrl":{"type":"string","format":"uri","description":"Approved HTTPS URL import host enabled by BuildPass. Prefer imageAttachment from the attachment upload endpoints.","uniqueKey":"photos.items.[INDEX].oneOf.0.imageUrl","typeLabel":"string\u003curi>"},"contentType":{"type":"string","default":"image/jpeg","pattern":"^image/","uniqueKey":"photos.items.[INDEX].oneOf.0.contentType","typeLabel":"string"},"width":{"type":"number","uniqueKey":"photos.items.[INDEX].oneOf.0.width","typeLabel":"number"},"height":{"type":"number","uniqueKey":"photos.items.[INDEX].oneOf.0.height","typeLabel":"number"},"capturedAt":{"type":"string","format":"date-time","uniqueKey":"photos.items.[INDEX].oneOf.0.capturedAt","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"photos.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["externalSourceId","fileName","sequenceId","imageUrl"],"properties":{"externalSourceId":{"type":"string","description":"Stable ID for this photo in your application. For photo reports, use the image block’s sourceBlockId.","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.1.externalSourceId","typeLabel":"string"},"imageUrl":{"type":"string","format":"uri","description":"Approved HTTPS URL import host enabled by BuildPass. Prefer imageAttachment from the attachment upload endpoints.","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.1.imageUrl","typeLabel":"string\u003curi>"},"fileName":{"type":"string","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.1.fileName","typeLabel":"string"},"sequenceId":{"type":"number","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.1.sequenceId","typeLabel":"number"},"imageAttachment":{"type":"object","required":["key","type"],"properties":{"key":{"type":"string","example":"external-uploads/ckbuilder123456789012345678/photo.jpg","isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.1.imageAttachment.key","typeLabel":"string"},"type":{"type":"string","enum":["attachment"],"isRequired":true,"uniqueKey":"photos.items.[INDEX].oneOf.1.imageAttachment.type","typeLabel":"enum\u003cstring>"},"regionId":{"oneOf":[{"type":"string","example":"au1","uniqueKey":"photos.items.[INDEX].oneOf.1.imageAttachment.regionId.oneOf.0","typeLabel":"string"},{"type":"null","example":"au1","uniqueKey":"photos.items.[INDEX].oneOf.1.imageAttachment.regionId.oneOf.1","typeLabel":"null"}],"uniqueKey":"photos.items.[INDEX].oneOf.1.imageAttachment.regionId","typeLabel":"string | null"}},"uniqueKey":"photos.items.[INDEX].oneOf.1.imageAttachment","typeLabel":"object"},"contentType":{"type":"string","default":"image/jpeg","pattern":"^image/","uniqueKey":"photos.items.[INDEX].oneOf.1.contentType","typeLabel":"string"},"width":{"type":"number","uniqueKey":"photos.items.[INDEX].oneOf.1.width","typeLabel":"number"},"height":{"type":"number","uniqueKey":"photos.items.[INDEX].oneOf.1.height","typeLabel":"number"},"capturedAt":{"type":"string","format":"date-time","uniqueKey":"photos.items.[INDEX].oneOf.1.capturedAt","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"photos.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"photos.items.[INDEX]","typeLabel":"object"},"minItems":1,"maxItems":100,"isRequired":true,"uniqueKey":"photos","typeLabel":"object[]"},"folderId":{"type":"string","description":"Existing photo folder ID. Reuse it when adding photos to the same folder. Omit folderId and folderName for photo reports.","uniqueKey":"folderId","typeLabel":"string"},"sourceApp":{"type":"string","example":"example-integrator","default":"external","maxLength":80,"minLength":1,"uniqueKey":"sourceApp","typeLabel":"string"},"projectId":{"oneOf":[{"type":"string","minLength":1,"pattern":"^proj_[a-z][a-z0-9]+$","description":"Project that owns the photos. Required when using folderId or folderName; optional for photo reports.","uniqueKey":"projectId.oneOf.0","typeLabel":"string"},{"type":"null","minLength":1,"pattern":"^proj_[a-z][a-z0-9]+$","description":"Project that owns the photos. Required when using folderId or folderName; optional for photo reports.","uniqueKey":"projectId.oneOf.1","typeLabel":"null"}],"uniqueKey":"projectId","typeLabel":"string | null"},"folderName":{"type":"string","example":"Site walkthrough - 2026-06-11","description":"Name of a new project gallery folder. Requires projectId. Omit for photo reports.","uniqueKey":"folderName","typeLabel":"string"}},"description":"A batch of up to 100 photos from the same external source.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"externalSourceId":"example-integrator:photo-page:page_123","photos":[{"externalSourceId":"\u003cstring>","imageAttachment":{"key":"external-uploads/ckbuilder123456789012345678/photo.jpg","type":"attachment","regionId":"au1"},"fileName":"\u003cstring>","sequenceId":123,"imageUrl":"\u003cstring>","contentType":"image/jpeg","width":123,"height":123,"capturedAt":"2023-11-07T05:31:56Z"}],"folderId":"\u003cstring>","sourceApp":"example-integrator","projectId":"\u003cstring>","folderName":"Site walkthrough - 2026-06-11"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"f1957822-9f3e-4e01-9ab3-5ae66d9f1d87":{"description":"Photos synced","content":{"application/json":{"schema":{"type":"object","properties":{"folderId":{"oneOf":[{"type":"string","uniqueKey":"folderId.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"folderId.oneOf.1","typeLabel":"null"}],"uniqueKey":"folderId","typeLabel":"string | null"},"createdAttachmentIds":{"type":"array","items":{"type":"string","uniqueKey":"createdAttachmentIds.items.[INDEX]","typeLabel":"string"},"uniqueKey":"createdAttachmentIds","typeLabel":"string[]"},"skippedExternalSourceIds":{"type":"array","items":{"type":"string","uniqueKey":"skippedExternalSourceIds.items.[INDEX]","typeLabel":"string"},"uniqueKey":"skippedExternalSourceIds","typeLabel":"string[]"},"failedPhotos":{"type":"array","items":{"type":"object","uniqueKey":"failedPhotos.items.[INDEX]","typeLabel":"object"},"uniqueKey":"failedPhotos","typeLabel":"object[]"},"photos":{"type":"array","items":{"type":"object","required":["externalSourceId","attachmentId","status"],"properties":{"externalSourceId":{"type":"string","isRequired":true,"uniqueKey":"photos.items.[INDEX].externalSourceId","typeLabel":"string"},"attachmentId":{"oneOf":[{"type":"string","description":"att_ identifier in folderless mode; frozen legacy raw identifier in folder mode.","isRequired":true,"uniqueKey":"photos.items.[INDEX].attachmentId.oneOf.0","typeLabel":"string"},{"type":"null","description":"att_ identifier in folderless mode; frozen legacy raw identifier in folder mode.","isRequired":true,"uniqueKey":"photos.items.[INDEX].attachmentId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"photos.items.[INDEX].attachmentId","typeLabel":"string | null"},"status":{"type":"string","enum":["CREATED","EXISTING","FAILED"],"isRequired":true,"uniqueKey":"photos.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"error":{"type":"object","uniqueKey":"photos.items.[INDEX].error","typeLabel":"object"}},"uniqueKey":"photos.items.[INDEX]","typeLabel":"object"},"uniqueKey":"photos","typeLabel":"object[]"},"status":{"type":"string","enum":["synced","partial"],"uniqueKey":"status","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"folderId":"\u003cstring>","createdAttachmentIds":["\u003cstring>"],"skippedExternalSourceIds":["\u003cstring>"],"failedPhotos":[{}],"photos":[{"externalSourceId":"\u003cstring>","attachmentId":"\u003cstring>","status":"CREATED","error":{}}],"status":"synced"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"82f60164-cefe-4313-956e-f9a06b30dd27":{"OAuth2":{"type":"oauth2","flows":{"clientCredentials":{"tokenUrl":"https://api.buildpass.global/oauth/token","scopes":{"read:subcontractors":"Read subcontractors","write:subcontractors":"Write subcontractors","read:prequalifications":"Read prequalifications","write:prequalifications":"Write prequalifications","read:insurances":"Read insurances","write:insurances":"Write insurances","read:contacts":"Read contacts","read:swms":"Read SWMS","read:timesheets":"Read timesheets","read:inductions":"Read inductions","read:meetings":"Read meetings","write:meetings":"Write meetings","read:defects":"Read defects","read:photos":"Read photos and photo folders","write:photos":"Create, update, delete, and sync photos and photo folders","read:site_access":"Read worker-project site access grants (explicitly approved pilot)","write:sign_on_events":"Record worker sign-on and sign-off events (explicitly approved pilot)"}}},"scopes":["write:photos"],"schemeName":"OAuth2"}}},"servers":{"5387ed31-b1f0-4d15-a199-19356eb085b4":{"url":"https://api.buildpass.global","description":"Production server"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"oauth2","flows":{"clientCredentials":{"tokenUrl":"https://api.buildpass.global/oauth/token","scopes":{"read:subcontractors":"Read subcontractors","write:subcontractors":"Write subcontractors","read:prequalifications":"Read prequalifications","write:prequalifications":"Write prequalifications","read:insurances":"Read insurances","write:insurances":"Write insurances","read:contacts":"Read contacts","read:swms":"Read SWMS","read:timesheets":"Read timesheets","read:inductions":"Read inductions","read:meetings":"Read meetings","write:meetings":"Write meetings","read:defects":"Read defects","read:photos":"Read photos and photo folders","write:photos":"Create, update, delete, and sync photos and photo folders","read:site_access":"Read worker-project site access grants (explicitly approved pilot)","write:sign_on_events":"Record worker sign-on and sign-off events (explicitly approved pilot)"}}},"scopes":["write:photos"],"schemeName":"OAuth2"},"schema":{"title":"OAuth2 Auth","type":"string","isRequired":true,"description":"The access token received from the authorization server in the OAuth 2.0 flow.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"OAuth2","name":"Authorization"}],"title":"OAuth2"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"buildpass","siteName":"BuildPass API","title":"Bulk upsert photos - BuildPass API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-16T12:37:16.645Z","originalFileLocation":"api-reference/builders/photo-gallery/bulk-upsert.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.\">\u003cmeta data-mint-head name=\"application-name\" content=\"BuildPass API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Bulk upsert photos - BuildPass API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"BuildPass API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://buildpass.mintlify.app/_mintlify/api/og/v2?division=Photos\u0026amp;title=Bulk+upsert+photos\u0026amp;description=Adds+multiple+photos+to+BuildPass+for+a+photo+report+or+project+gallery+folder.+Returns+a+result+for+each+photo+and+attachment+IDs+for+successfully+saved+photos\u0026amp;theme=0fa34181e7ac4b84f888ffc0\u0026amp;signature=5bc3b9ae3aac6ea840ba576e44207956085df1983fe481a241a6d3c4f163fb2d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Bulk upsert photos - BuildPass API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://buildpass.mintlify.app/_mintlify/api/og/v2?division=Photos\u0026amp;title=Bulk+upsert+photos\u0026amp;description=Adds+multiple+photos+to+BuildPass+for+a+photo+report+or+project+gallery+folder.+Returns+a+result+for+each+photo+and+attachment+IDs+for+successfully+saved+photos\u0026amp;theme=0fa34181e7ac4b84f888ffc0\u0026amp;signature=5bc3b9ae3aac6ea840ba576e44207956085df1983fe481a241a6d3c4f163fb2d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/buildpass/aZNfnfSSClMexl6a/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"BuildPass API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#68d07f\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/builders/photo-gallery/bulk-upsert.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developer.buildpass.global/#organization\",\"name\":\"BuildPass API\",\"url\":\"https://developer.buildpass.global\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/buildpass/Cb9JmQTwpkItOpus/logo/light.svg?fit=max\u0026auto=format\u0026n=Cb9JmQTwpkItOpus\u0026q=85\u0026s=318747a7e7df24c220865cf82aa2bb95\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developer.buildpass.global#website\",\"name\":\"BuildPass API\",\"url\":\"https://developer.buildpass.global\",\"publisher\":{\"@id\":\"https://developer.buildpass.global/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert#webpage\",\"url\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert\",\"name\":\"Bulk upsert photos\",\"description\":\"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.\",\"dateModified\":\"2026-09-16T12:37:16.645Z\",\"isPartOf\":{\"@id\":\"https://developer.buildpass.global#website\"},\"breadcrumb\":{\"@id\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Photos\",\"item\":\"https://developer.buildpass.global/api-reference/builders/photos/list\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bulk upsert photos\",\"item\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert#apireference\",\"headline\":\"Bulk upsert photos\",\"name\":\"Bulk upsert photos\",\"description\":\"Adds multiple photos to BuildPass for a photo report or project gallery folder. Returns a result for each photo and attachment IDs for successfully saved photos. Existing photos are reused to avoid duplicates.\",\"url\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert\",\"mainEntityOfPage\":{\"@id\":\"https://developer.buildpass.global/api-reference/builders/photo-gallery/bulk-upsert#webpage\"},\"dateModified\":\"2026-09-16T12:37:16.645Z\",\"publisher\":{\"@id\":\"https://developer.buildpass.global/#organization\"},\"isPartOf\":{\"@id\":\"https://developer.buildpass.global#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BuildPass API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"BuildPass API","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"API Reference","groups":[{"group":"Authentication","pages":[{"title":"Authentication token","openapi":"POST /oauth/token","href":"/api-reference/authentication/post"}]},{"group":"Builders","pages":[{"title":"List builders","openapi":"GET /builders","href":"/api-reference/builders/list"},{"title":"Get builder","openapi":"GET /builders/{id}","href":"/api-reference/builders/get"}]},{"group":"Projects","pages":[{"title":"List projects","openapi":"GET /builders/{id}/projects","href":"/api-reference/builders/projects/list"},{"title":"Get project","openapi":"GET /builders/{id}/projects/{projectId}","href":"/api-reference/builders/projects/get"}]},{"group":"Site access (planned)","pages":[{"title":"List site access (limited pilot)","openapi":"GET /builders/{builderId}/projects/{projectId}/site-access","href":"/api-reference/builders/projects/site-access/list"},{"title":"Record gate attendance (limited pilot)","openapi":"POST /builders/{builderId}/projects/{projectId}/sign-on-events","href":"/api-reference/builders/projects/site-access/events"}]},{"group":"Meetings","pages":[{"title":"List meetings","openapi":"GET /builders/{builderId}/meetings","href":"/api-reference/builders/meetings/list"},{"title":"Create meeting","openapi":"POST /builders/{builderId}/meetings","href":"/api-reference/builders/meetings/create"},{"title":"Update meeting","openapi":"PATCH /builders/{builderId}/meetings/{meetingId}","href":"/api-reference/builders/meetings/update"},{"title":"Delete meeting","openapi":"DELETE /builders/{builderId}/meetings/{meetingId}","href":"/api-reference/builders/meetings/delete"},{"title":"Start meeting","openapi":"POST /builders/{builderId}/meetings/{meetingId}/start","href":"/api-reference/builders/meetings/start"},{"title":"End meeting","openapi":"POST /builders/{builderId}/meetings/{meetingId}/end","href":"/api-reference/builders/meetings/end"},{"title":"List meeting notes","openapi":"GET /builders/{builderId}/meetings/{meetingId}/notes","href":"/api-reference/builders/meetings/notes/list"},{"title":"Create or update meeting note","openapi":"POST /builders/{builderId}/meetings/{meetingId}/notes","href":"/api-reference/builders/meetings/notes/post"}]},{"group":"Defects","pages":[{"title":"List defects","openapi":"GET /builders/{builderId}/defects","href":"/api-reference/builders/defects/list"},{"title":"Get defect","openapi":"GET /builders/{builderId}/defects/{defectId}","href":"/api-reference/builders/defects/get"}]},{"group":"Attachments","pages":[{"title":"Create an attachment upload URL","openapi":"POST /builders/{builderId}/attachments/presign","href":"/api-reference/builders/attachments/presign"},{"title":"Upload attachment","openapi":"POST /builders/{builderId}/attachments/upload","href":"/api-reference/builders/attachments/upload"},{"title":"Bulk upload attachments","openapi":"POST /builders/{builderId}/attachments/bulk-upload","href":"/api-reference/builders/attachments/bulk-upload"}]},{"group":"Photos","pages":[{"title":"List photos","openapi":"GET /builders/{builderId}/photos","href":"/api-reference/builders/photos/list"},{"title":"Create photo","openapi":"POST /builders/{builderId}/photos","href":"/api-reference/builders/photos/create"},{"title":"Get photo","openapi":"GET /builders/{builderId}/photos/{photoId}","href":"/api-reference/builders/photos/get"},{"title":"Update photo","openapi":"PATCH /builders/{builderId}/photos/{photoId}","href":"/api-reference/builders/photos/update"},{"title":"Delete photo","openapi":"DELETE /builders/{builderId}/photos/{photoId}","href":"/api-reference/builders/photos/delete"},{"title":"List photo folders","openapi":"GET /builders/{builderId}/photo-folders","href":"/api-reference/builders/photo-folders/list"},{"title":"Create photo folder","openapi":"POST /builders/{builderId}/photo-folders","href":"/api-reference/builders/photo-folders/create"},{"title":"Get photo folder","openapi":"GET /builders/{builderId}/photo-folders/{folderId}","href":"/api-reference/builders/photo-folders/get"},{"title":"Update photo folder","openapi":"PATCH /builders/{builderId}/photo-folders/{folderId}","href":"/api-reference/builders/photo-folders/update"},{"title":"Delete photo folder","openapi":"DELETE /builders/{builderId}/photo-folders/{folderId}","description":null,"href":"/api-reference/builders/photo-folders/delete"},{"title":"Bulk upsert photos","openapi":"POST /builders/{builderId}/photo-gallery/bulk-upsert","href":"/api-reference/builders/photo-gallery/bulk-upsert"},{"title":"Sync a photo report","openapi":"POST /builders/{builderId}/photo-reports/sync","description":"Creates or updates a photo report in BuildPass, including its title, text, photos and optional project. Use this endpoint to keep reports from your application in sync with BuildPass.","href":"/api-reference/builders/photo-reports/sync"}]},{"group":"Subcontractors","icon":{"name":"users","style":"light"},"pages":[{"title":"List subcontractors","openapi":"GET /subcontractors","href":"/api-reference/subcontractors/list"},{"title":"Get subcontractor","openapi":"GET /subcontractors/{id}","href":"/api-reference/subcontractors/get"},{"title":"List subcontractor projects","openapi":"GET /subcontractors/{id}/projects","href":"/api-reference/subcontractors/projects/list"},{"title":"List subcontractor contacts","openapi":"GET /subcontractors/{id}/contacts","href":"/api-reference/subcontractors/contacts/list"}]},{"group":"Insurances","pages":[{"title":"List insurance documents","openapi":"GET /subcontractors/{id}/insurances","href":"/api-reference/subcontractors/insurances/list"},{"title":"Get insurance document","openapi":"GET /subcontractors/{id}/insurances/{insuranceId}","href":"/api-reference/subcontractors/insurances/get"}]},{"group":"Prequalifications","pages":[{"title":"List prequalifications","openapi":"GET /subcontractors/{id}/prequalifications","href":"/api-reference/subcontractors/prequalifications/list"},{"title":"Get prequalification","openapi":"GET /subcontractors/{id}/prequalifications/{prequalId}","href":"/api-reference/subcontractors/prequalifications/get"}]},{"group":"SWMS","pages":[{"title":"List SWMS documents","openapi":"GET /subcontractors/{id}/swms","href":"/api-reference/subcontractors/swms/list"},{"title":"Get SWMS document","openapi":"GET /subcontractors/{id}/swms/{swmsDocId}","href":"/api-reference/subcontractors/swms/get"}]},{"group":"Inductions","pages":[{"title":"List inductions for subcontractor","openapi":"GET /subcontractors/{id}/inductions","href":"/api-reference/subcontractors/inductions/list"},{"title":"List inductions for project","openapi":"GET /builders/{builderId}/projects/{projectId}/inductions","href":"/api-reference/builders/projects/inductions/list"},{"title":"Get induction","openapi":"GET /builders/{builderId}/projects/{projectId}/inductions/{identifierOrId}","href":"/api-reference/builders/projects/inductions/get"}]},{"group":"Timesheets","pages":[{"title":"List timesheets","openapi":"GET /timesheets","href":"/api-reference/timesheets/list"},{"title":"Get timesheet","openapi":"GET /timesheets/{timesheetId}","href":"/api-reference/timesheets/get"},{"title":"Get time types","openapi":"GET /timesheets/time-types","href":"/api-reference/timesheets/timeTypes"},{"title":"Get cost codes","openapi":"GET /timesheets/cost-codes","href":"/api-reference/timesheets/costCodes"}]}]}]},"title":"Bulk upsert photos - BuildPass API","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","Page-7TwLLapg.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js","Markdown-DKsLa3wy.js","clsx-CefdjKz2.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BaREnp3o.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-sgx_0XzF.js"]}