{
  "openapi": "3.0.1",
  "info": {
    "title": "Product Photo to 3D Model with Real-World Scale",
    "description": "Turns product photos into web-ready GLB models scaled to the real dimensions you give, oriented front-forward, with the pivot on the floor. Ready to drop into Shopify, WooCommerce, Wix or any model-viewer page.",
    "version": "0.1",
    "x-build-id": "iBNHcHgviKCDpa7DJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/toolsheder~photo-to-3d/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-toolsheder-photo-to-3d",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/toolsheder~photo-to-3d/runs": {
      "post": {
        "operationId": "runs-sync-toolsheder-photo-to-3d",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/toolsheder~photo-to-3d/run-sync": {
      "post": {
        "operationId": "run-sync-toolsheder-photo-to-3d",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "items",
          "providerApiKey"
        ],
        "properties": {
          "items": {
            "title": "Products",
            "type": "array",
            "description": "One entry per product. Give 2 or 3 photos from different angles, and the real dimensions in millimetres. The dimensions are what make the model the right size in AR, so they are not optional.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "title": "Product id",
                  "description": "Used as the file name. Letters, digits, dot, dash and underscore."
                },
                "imageUrls": {
                  "type": "array",
                  "title": "Photo URLs",
                  "description": "Public image URLs. The first one is treated as the front view.",
                  "items": {
                    "type": "string"
                  }
                },
                "widthMm": {
                  "type": "integer",
                  "title": "Width in mm",
                  "description": "Real width of the product in millimetres, side to side."
                },
                "heightMm": {
                  "type": "integer",
                  "title": "Height in mm",
                  "description": "Real height of the product in millimetres, floor to top."
                },
                "depthMm": {
                  "type": "integer",
                  "title": "Depth in mm",
                  "description": "Real depth of the product in millimetres, front to back."
                },
                "yawDegrees": {
                  "type": "integer",
                  "title": "Rotation in degrees",
                  "description": "Leave empty to let the actor decide. Set 90, 180 or 270 if the model faces the wrong way."
                },
                "targetPolycount": {
                  "type": "integer",
                  "title": "Provider mesh density",
                  "description": "How many faces to ask the provider for before this actor simplifies. Leave empty for 30000, which suits most furniture."
                }
              },
              "required": [
                "id",
                "imageUrls",
                "widthMm",
                "heightMm",
                "depthMm"
              ],
              "additionalProperties": false
            }
          },
          "provider": {
            "title": "Generation provider",
            "enum": [
              "meshy",
              "tripo"
            ],
            "type": "string",
            "description": "Which image-to-3D service to call. Meshy also returns a USDZ file for iOS AR at no extra cost. Tripo can align the mesh to your front photo, which helps when models come out facing the wrong way.",
            "default": "meshy"
          },
          "providerApiKey": {
            "title": "Provider API key",
            "type": "string",
            "description": "Your own Meshy or Tripo key. You bring your own, so the models are licensed to you directly by the provider with nobody in between. A paid provider tier is normally required if you intend to sell or redistribute the models."
          },
          "scaleMode": {
            "title": "How to apply your dimensions",
            "enum": [
              "exact",
              "uniform"
            ],
            "type": "string",
            "description": "Exact stretches the mesh to match your width, height and depth precisely, which is what you want when your dimensions are right. Uniform keeps the generated proportions and fits the model inside your dimensions instead.",
            "default": "exact"
          },
          "maxTriangles": {
            "title": "Triangle budget",
            "minimum": 5000,
            "maximum": 200000,
            "type": "integer",
            "description": "Meshes above this are simplified once, on our side. 60000 is the measured sweet spot: within 0.35% of an unsimplified mesh in rendered pixels, well under AR limits. The provider's own remeshing stays off because it was measured to introduce holes.",
            "default": 60000
          },
          "maxTextureSize": {
            "title": "Maximum texture size",
            "enum": [
              "512",
              "1024",
              "2048"
            ],
            "type": "string",
            "description": "Textures larger than this are resized. 2048 is the ceiling Shopify gives for mobile web.",
            "default": "2048"
          },
          "textureFormat": {
            "title": "Texture format",
            "enum": [
              "jpeg",
              "png",
              "webp"
            ],
            "type": "string",
            "description": "JPEG is the safe default because it works everywhere, including Android AR. WebP makes smaller files but relies on a glTF extension that Google's Scene Viewer does not list as supported, so AR on Android may fail.",
            "default": "jpeg"
          },
          "textureResolution": {
            "title": "Texture detail to generate",
            "enum": [
              "2k",
              "4k"
            ],
            "type": "string",
            "description": "What to ask the provider for before the model is resized to your ceiling. 4k costs the same on most plans and downscales to a visibly sharper 2048 texture, which shows on fabric and wood.",
            "default": "2k"
          },
          "dracoCompression": {
            "title": "Draco compression",
            "type": "boolean",
            "description": "Shrinks geometry considerably, but Google's Scene Viewer does not list Draco among the glTF extensions it supports, so AR on Android may fail. Leave off unless you only need the web viewer.",
            "default": false
          },
          "pivotOnFloor": {
            "title": "Put the origin on the floor",
            "type": "boolean",
            "description": "Generators put the origin at the centre of the object, which makes it sink into the floor in AR. Shopify requires the origin at the product's base.",
            "default": true
          },
          "recenterHorizontally": {
            "title": "Centre horizontally",
            "type": "boolean",
            "description": "Centres the model on X and Z so it turns around itself rather than orbiting.",
            "default": true
          },
          "storeName": {
            "title": "Storage name",
            "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$",
            "maxLength": 63,
            "type": "string",
            "description": "Models are saved to a named storage so the download links keep working. Reuse the same name across runs to keep one library. Unnamed storage is deleted after seven days, so this is not left to chance.",
            "default": "photo-to-3d-models"
          },
          "concurrency": {
            "title": "Products at once",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many products to process in parallel. Leave empty to match your provider's queue limit. Raise the actor's memory if you raise this."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}