{"components":{"schemas":{"ProjectInProgress":{"description":"Project not yet ready; only polling info is returned.","properties":{"name":{"description":"Project URL slug.","type":"string"},"status":{"description":"Processing progress (0=queued, 100=ready).","maximum":99,"minimum":0,"type":"integer"}},"required":["name","status"],"type":"object"},"ProjectReady":{"description":"Project finished processing. All columns from the Project model.","properties":{"access_level_for_comments":{"enum":[0,1,2,3,4],"type":"integer"},"cesium_map_offset":{"type":"number"},"colored_links":{"type":"boolean"},"coord_unit":{"type":"string"},"created":{"format":"date-time","type":"string"},"deleted":{"type":"boolean"},"enabled_setups":{"type":"integer"},"epsg":{"nullable":true,"type":"integer"},"errors":{"type":"integer"},"extensions":{"type":"string"},"frame_ancestors":{"type":"string"},"geotiff":{"type":"boolean"},"glb":{"type":"boolean"},"id":{"type":"integer"},"ifc":{"type":"boolean"},"kml":{"type":"boolean"},"last_usage":{"format":"date-time","nullable":true,"type":"string"},"multiprojects":{"type":"string"},"name":{"type":"string"},"obj":{"type":"boolean"},"pdf":{"type":"boolean"},"potree":{"type":"boolean"},"potree_use_pitch_roll":{"type":"boolean"},"privacy_mode":{"enum":[0,1,2],"type":"integer"},"proj4":{"type":"string"},"public_project":{"type":"boolean"},"redirect":{"type":"string"},"setups_count":{"type":"integer"},"size":{"type":"number"},"status":{"enum":[100],"type":"integer"},"threedgs":{"type":"boolean"},"title":{"type":"string"},"updated":{"format":"date-time","nullable":true,"type":"string"},"video360":{"type":"boolean"},"views":{"type":"integer"},"welcome_overlay":{"type":"string"}},"type":"object"},"ProjectSummary":{"oneOf":[{"$ref":"#/components/schemas/ProjectInProgress"},{"$ref":"#/components/schemas/ProjectReady"}]}},"securitySchemes":{"ApiKeyAuth":{"bearerFormat":"sk_\u2026","scheme":"bearer","type":"http"}}},"info":{"description":"Public REST API. Authenticate with a Bearer token obtained from your profile page at /profile#api-keys","title":"Public API","version":"1.0.0"},"openapi":"3.0.2","paths":{"/api/v1/projects":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"projects":{"items":{"$ref":"#/components/schemas/ProjectSummary"},"type":"array"}},"required":["projects"],"type":"object"}}},"description":"List of the authenticated user's projects. Each item is minimal while the project is processing and becomes the full record once ready."},"401":{"description":"Missing or invalid API key"}},"security":[{"ApiKeyAuth":[]}],"summary":"List projects owned by the authenticated user.","tags":["Projects"]},"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"add_setups":{"description":"URL slug of an existing project to add files to instead of creating a new one (you must own it). Equivalent to the web /projects/<url>/add-files-to-the-project flow.","type":"string"},"autocontrast":{"default":true,"description":"Auto-contrast panorama images.","type":"boolean"},"autostart":{"default":true,"description":"Start processing immediately after files/links are uploaded.","type":"boolean"},"canvas_size_factor":{"default":1.0,"description":"Canvas size factor for synthesized panoramas. If the generated panoramas have many empty pixels, try reducing to 0.5.","type":"number"},"coordinate_system":{"description":"EPSG code, PROJ string, or WKT string. Required to link coordinates to the project's real position on the map.","example":"EPSG:25832","type":"string"},"correct_equirectangular_panorama":{"default":true,"description":"Apply orientation correction: reorient the panorama using the provided quaternion to remove tilt and align with the global axes.","type":"boolean"},"correct_very_big_coordinates":{"default":false,"description":"If CAD files contain very large coordinates, try correcting them. Experimental \u2014 may work poorly and can completely damage the model.","type":"boolean"},"decimate":{"default":1,"description":"Simple thinning \u2014 keep every N-th point. 1 = no thinning.","enum":[1,2,4,8,16,32,64,128,256,512],"type":"integer"},"detect_faces":{"default":true,"description":"Blur faces (including partial).","type":"boolean"},"detect_objects_engine":{"default":"","description":"Engine for blurring people and vehicles in panoramas. `\"\"` = off, `anonymizer` = on-premise (free). Default off.","enum":["","anonymizer"],"type":"string"},"detect_people":{"default":true,"description":"Blur whole people (full body).","type":"boolean"},"detect_plates":{"default":true,"description":"Blur license plates.","type":"boolean"},"detect_vehicles":{"default":true,"description":"Blur whole vehicles (car/truck/bus/motorcycle/bicycle).","type":"boolean"},"do_not_use_photos":{"default":false,"description":"Do not use embedded panoramic photos; synthesize panoramas from the point cloud instead.","type":"boolean"},"download_link":{"description":"Import files from a remote link. Provide this OR upload_id (not both). Supported: direct download link, Google Drive, Dropbox, Yandex.Disk, WeTransfer.","example":"https://example.com/data.zip","type":"string"},"e57_ignore_invalid_state":{"default":true,"description":"For E57 files, load points marked as InvalidState.","type":"boolean"},"intensity_pano_synthesis":{"default":false,"description":"For SLAM projects, synthesize intensity panoramas in addition to color panoramas.","type":"boolean"},"max_point_count":{"default":2000000000,"description":"Point limit per point cloud. Need larger? Contact technical support.","type":"integer"},"min_distance":{"default":2.0,"description":"Minimum distance (meters) between JPG panoramas from mobile laser scanners. Panoramas captured closer than this are ignored.","type":"number"},"min_time_delta":{"default":1.0,"description":"Minimum time interval (seconds) between JPG panoramas from mobile laser scanners. Panoramas captured more frequently than this are ignored.","type":"number"},"new_levels":{"default":1,"description":"Number of floors scanned (for multi-storey buildings). The corresponding number of levels is created in the project; stations are auto-assigned based on elevation. Can be reconfigured later.","type":"integer"},"pano2to1type":{"default":0,"description":"Adjust panoramas to 2:1 aspect ratio. 0 = enlarge canvas, 1 = stretch image.","enum":[0,1],"type":"integer"},"pc_converter":{"default":"Auto","description":"Point-cloud converter. Admin-only option; non-admins should leave as Auto.","enum":["Auto","PotreeConverter","EntwineLasFileByFile","EntwineLasFolder","EntwineLasInfoSubset","Untwine"],"type":"string"},"privacy_mode":{"default":2,"description":"0 = public (anyone can access; may appear in Public projects). 1 = via link (anyone with the link, including guests). 2 = private (only the owner and invited project users). Can be changed later in Project settings.","enum":[0,1,2],"type":"integer"},"process_merged_pc":{"default":true,"description":"Process the merged point cloud for the whole scene.","type":"boolean"},"process_structured_pc":{"default":true,"description":"Process each point cloud separately (LGSX, RCP, RCS, E57, LAS, LAZ, PTX, PLY, PTS, XYZ).","type":"boolean"},"projecttag":{"description":"ID of an existing project tag to attach. Tags organize projects into folders and support a multi-level hierarchy. Can be changed later in Project settings.","nullable":true,"type":"integer"},"rvt_converter":{"default":"datadrivenconstruction","description":"Converter for Revit (.rvt) files. datadrivenconstruction \u2014 free of charge; Autodesk Model Derivative API \u2014 0.01 tokens per MB.","type":"string"},"save_source":{"default":false,"description":"Save source files \u2014 uploaded files are stored with the project and can be downloaded at any time. Paid plans only.","type":"boolean"},"share_s20":{"default":"fast","description":"Share S20 panorama stitching mode. `nice` = slow precise stitching; panoramas do not match the point cloud. `fast` = quick stitching; panoramas also do not match the point cloud, but less so.","enum":["nice","fast"],"type":"string"},"title":{"description":"Any characters allowed, including emojis. Leave blank to auto-generate from filename or date. Can be changed later in Project settings.","example":"My API project","type":"string"},"upload_id":{"description":"Id of an upload session (POST /api/v1/uploads) whose files have all finished uploading. Provide this OR download_link (not both).","example":"aB3xK9mP","type":"string"},"video_1080p":{"default":false,"description":"Generate 1080p (1920x1080, ~6 Mbps) rendition for 360 video. Only generated if source resolution allows.","type":"boolean"},"video_2k":{"default":false,"description":"Generate 2K (2560x1440, ~10 Mbps) rendition for 360 video. Only generated if source resolution allows.","type":"boolean"},"video_4k":{"default":true,"description":"Generate 4K (3840x2160, ~18 Mbps) rendition for 360 video. Only generated if source resolution allows.","type":"boolean"},"video_5_7k":{"default":false,"description":"Generate 5.7K (5760x2880, ~30 Mbps) rendition for 360 video. Not supported by iPhone. Only generated if source resolution allows.","type":"boolean"},"video_codec":{"default":"h264","description":"Video codec used for 360 video renditions.","type":"string"},"video_preset":{"default":"fast","description":"ffmpeg encoder preset, trading off encoding speed vs compression efficiency. veryfast (~4x faster, ~25 percent larger files); faster (~2x faster, ~15 percent larger); fast (default, ~1.5x faster, ~5 percent larger); medium; slow (~1.5x slower, ~5 percent smaller).","enum":["veryfast","faster","fast","medium","slow"],"type":"string"},"z_cross_section_on_the_map":{"description":"Leave blank to auto-calculate.","type":"string"}},"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ProjectInProgress"},{"properties":{"message":{"example":"processing_started","type":"string"}},"type":"object"}]}}},"description":"Project created and processing started."},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"402":{"description":"Storage quota exceeded"},"403":{"description":"Tariff does not permit project creation"},"404":{"description":"upload_id was given but no such upload session exists"},"429":{"description":"Rate limit exceeded"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create a new project from uploaded files (upload_id) or a remote download_link.","tags":["Projects"]}},"/api/v1/projects/{url}":{"get":{"parameters":[{"description":"Project URL slug (name column in the database).","in":"path","name":"url","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectSummary"}}},"description":"Project summary. Minimal while processing, full record once status == 100."},"401":{"description":"Missing or invalid API key"},"403":{"description":"Project belongs to a different user"},"404":{"description":"Project not found"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get a project's current status.","tags":["Projects"]}},"/api/v1/uploads":{"post":{"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"expires_in_seconds":{"description":"Abandoned sessions are garbage-collected after this long.","type":"integer"},"upload_id":{"description":"Opaque session id. Also becomes the project URL slug on creation (if free).","type":"string"}},"required":["upload_id"],"type":"object"}}},"description":"Session created. Stream files to it, then create a project with this upload_id."},"401":{"description":"Missing or invalid API key"},"402":{"description":"Storage quota exceeded"},"403":{"description":"Tariff does not permit uploads"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create an upload session.","tags":["Uploads"]}},"/api/v1/uploads/{upload_id}":{"delete":{"parameters":[{"in":"path","name":"upload_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"deleted":{"type":"boolean"}},"type":"object"}}},"description":"Session deleted (or already absent)."},"401":{"description":"Missing or invalid API key"}},"security":[{"ApiKeyAuth":[]}],"summary":"Discard an upload session and everything in it (idempotent).","tags":["Uploads"]},"get":{"parameters":[{"in":"path","name":"upload_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"files":{"items":{"properties":{"complete":{"type":"boolean"},"name":{"type":"string"},"received":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"type":"array"},"upload_id":{"type":"string"}},"type":"object"}}},"description":"Session contents."},"401":{"description":"Missing or invalid API key"},"404":{"description":"Upload session not found"}},"security":[{"ApiKeyAuth":[]}],"summary":"List the files in a session and their progress.","tags":["Uploads"]}},"/api/v1/uploads/{upload_id}/{filename}":{"get":{"parameters":[{"in":"path","name":"upload_id","required":true,"schema":{"type":"string"}},{"in":"path","name":"filename","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"complete":{"type":"boolean"},"received":{"type":"integer"},"total":{"type":"integer"}},"type":"object"}}},"description":"Progress for the file."},"401":{"description":"Missing or invalid API key"},"404":{"description":"Session or file not found"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get one file's upload progress (use received to resume after an interruption).","tags":["Uploads"]},"put":{"parameters":[{"in":"path","name":"upload_id","required":true,"schema":{"pattern":"^[A-Za-z0-9]{8,64}$","type":"string"}},{"description":"Path separators are stripped (no nested folders \u2014 upload an archive for a tree).","in":"path","name":"filename","required":true,"schema":{"type":"string"}},{"description":"Omit to upload the whole file in one request. Provide for a chunk; chunks must be contiguous and in order.","in":"header","name":"Content-Range","required":false,"schema":{"example":"bytes 0-20971519/104857600","type":"string"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"complete":{"type":"boolean"},"received":{"type":"integer"},"total":{"type":"integer"}},"type":"object"}}},"description":"Chunk stored. complete=true once received == total (file finalised)."},"400":{"description":"invalid_upload_id | invalid_filename | invalid_content_range | chunk_length_mismatch"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Upload session not found"},"409":{"description":"Non-contiguous chunk (a gap before this offset); response includes received"},"411":{"description":"Length required (single-shot upload without Content-Length)"},"413":{"description":"file_too_large | session_too_large"},"415":{"description":"File extension not allowed"}},"security":[{"ApiKeyAuth":[]}],"summary":"Upload a file, or one chunk of it, into a session.","tags":["Uploads"]}}},"servers":[{"url":"https://360-for-you.com"}]}
