diff --git a/spec.json b/spec.json index d9420875..7006c2ec 100644 --- a/spec.json +++ b/spec.json @@ -203,8 +203,30 @@ "meta" ], "summary": "List all active announcements.", - "description": "No authentication is required.", + "description": "No authentication is required. Results are ordered newest first, with the announcement ID breaking ties.", "operationId": "get_announcements", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + } + ], "responses": { "200": { "description": "successful operation", @@ -277,7 +299,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AnnouncementList" + "$ref": "#/components/schemas/AnnouncementResultsPage" } } } @@ -289,7 +311,10 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } } }, "/api-calls/{id}": { @@ -7534,14 +7559,14 @@ "x-billable": false } }, - "/org/api-calls": { + "/org/addresses": { "get": { "tags": [ - "api-calls" + "addresses" ], - "summary": "List API calls for your org.", - "description": "This includes all API calls that were made by users in the org.\n\nThis endpoint requires authentication by an org admin. It returns the API calls for the authenticated user's org.\n\nThe API calls are returned in order of creation, with the most recently created API calls first.", - "operationId": "org_list_api_calls", + "summary": "List saved addresses belonging to your active organization.", + "description": "Current members can read delivery destinations; only admins see billing cards or manage the book. One-off and archived destinations are omitted.", + "operationId": "list_org_addresses", "parameters": [ { "in": "query", @@ -7562,13 +7587,6 @@ "nullable": true, "type": "string" } - }, - { - "in": "query", - "name": "sort_by", - "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" - } } ], "responses": { @@ -7643,7 +7661,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiCallWithPriceResultsPage" + "$ref": "#/components/schemas/AddressResponseResultsPage" } } } @@ -7659,31 +7677,27 @@ "x-dropshot-pagination": { "required": [] } - } - }, - "/org/api-calls/{id}": { - "get": { + }, + "post": { "tags": [ - "api-calls" + "addresses" ], - "summary": "Get an API call for an org.", - "description": "This endpoint requires authentication by an org admin. It returns details of the requested API call for the user's org.", - "operationId": "get_api_call_for_org", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "The ID of the API call.", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create a saved or one-off destination belonging to your organization.", + "description": "Admins can save cards or select shipping defaults. Other current members can create one-off destinations with is_saved=false without modifying the book.", + "operationId": "create_org_address", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAddressRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -7753,7 +7767,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiCallWithPrice" + "$ref": "#/components/schemas/AddressResponse" } } } @@ -7766,19 +7780,17 @@ } }, "x-billable": false - } - }, - "/org/billing/usage-collection-threshold": { - "get": { + }, + "options": { "tags": [ - "payments", - "orgs" + "hidden" ], - "summary": "Get the authenticated organization's aggregate-usage collection threshold.", - "operationId": "get_org_usage_collection_threshold", + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_addresses", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -7844,13 +7856,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" - } - } } }, "4XX": { @@ -7861,24 +7866,27 @@ } }, "x-billable": false - }, - "put": { + } + }, + "/org/addresses/{id}": { + "get": { "tags": [ - "payments", - "orgs" + "addresses" ], - "summary": "Set the authenticated organization's aggregate-usage collection threshold.", - "operationId": "set_org_usage_collection_threshold", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdSet" - } + "summary": "Get an address from your active organization's address book.", + "description": "Requires current membership. Billing cards require organization-admin access.", + "operationId": "get_org_address", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" } - }, - "required": true - }, + } + ], "responses": { "200": { "description": "successful operation", @@ -7951,7 +7959,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" + "$ref": "#/components/schemas/AddressResponse" } } } @@ -7965,25 +7973,34 @@ }, "x-billable": false }, - "delete": { + "put": { "tags": [ - "payments", - "orgs" + "addresses" ], - "summary": "Restore the default for the authenticated organization's aggregate-usage collection threshold.", - "operationId": "reset_org_usage_collection_threshold", + "summary": "Replace an organization delivery address and its shipping-default selection.", + "description": "Requires organization-admin access and the current revision_id as expected_revision. Previously pinned order contents remain unchanged.", + "operationId": "update_org_address", "parameters": [ { - "in": "query", - "name": "expected_version", - "description": "Version returned by the read that this mutation is based on.", + "in": "path", + "name": "id", + "description": "The identifier.", "required": true, "schema": { - "type": "integer", - "format": "int64" + "$ref": "#/components/schemas/Uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAddressRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -8056,7 +8073,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" + "$ref": "#/components/schemas/AddressResponse" } } } @@ -8070,123 +8087,36 @@ }, "x-billable": false }, - "options": { - "tags": [ - "hidden" - ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_usage_collection_threshold", - "responses": { - "204": { - "description": "resource updated", - "headers": { - "Access-Control-Allow-Credentials": { - "description": "Access-Control-Allow-Credentials header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Headers": { - "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Methods": { - "description": "Access-Control-Allow-Methods header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Origin": { - "description": "Access-Control-Allow-Origin header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Content-Location": { - "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Location": { - "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Set-Cookie": { - "description": "Set-Cookie header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "X-Api-Call-Id": { - "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", - "style": "simple", - "required": true, - "schema": { - "type": "string" - } - } - } - }, - "4XX": { - "$ref": "#/components/responses/Error" - }, - "5XX": { - "$ref": "#/components/responses/Error" - } - }, - "x-billable": false - } - }, - "/org/dataset/s3/policies": { - "get": { + "delete": { "tags": [ - "orgs" + "addresses" ], - "summary": "Return the IAM policies customers should apply when onboarding an S3 dataset.", - "operationId": "org_dataset_s3_policies", + "summary": "Remove an organization delivery address from future selection.", + "description": "Requires organization-admin access and the current expected_revision. Previously pinned revisions remain available until organization erasure.", + "operationId": "delete_org_address", "parameters": [ { - "in": "query", - "name": "uri", - "description": "Dataset URI used to scope generated IAM policies.", + "in": "path", + "name": "id", + "description": "The identifier.", "required": true, "schema": { - "type": "string" + "$ref": "#/components/schemas/Uuid" } }, { "in": "query", - "name": "role_arn", - "description": "IAM role ARN customers expect Zoo to assume when reading the dataset.", + "name": "expected_revision", + "description": "revision_id returned when the card was loaded.", "required": true, "schema": { - "type": "string" + "$ref": "#/components/schemas/Uuid" } } ], "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -8252,11 +8182,101 @@ "type": "string" } } - }, - "content": { - "application/json": { + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_address", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "204": { + "description": "successful operation, no content", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", "schema": { - "$ref": "#/components/schemas/DatasetS3Policies" + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" } } } @@ -8271,13 +8291,14 @@ "x-billable": false } }, - "/org/datasets": { + "/org/api-calls": { "get": { "tags": [ - "orgs" + "api-calls" ], - "summary": "List every dataset that belongs to the caller's organization.", - "operationId": "list_org_datasets", + "summary": "List API calls for your org.", + "description": "This includes all API calls that were made by users in the org.\n\nThis endpoint requires authentication by an org admin. It returns the API calls for the authenticated user's org.\n\nThe API calls are returned in order of creation, with the most recently created API calls first.", + "operationId": "org_list_api_calls", "parameters": [ { "in": "query", @@ -8299,15 +8320,6 @@ "type": "string" } }, - { - "in": "query", - "name": "lookup_enabled", - "description": "When set, only return datasets with the matching lookup setting.", - "schema": { - "nullable": true, - "type": "boolean" - } - }, { "in": "query", "name": "sort_by", @@ -8388,7 +8400,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgDatasetResultsPage" + "$ref": "#/components/schemas/ApiCallWithPriceResultsPage" } } } @@ -8404,27 +8416,31 @@ "x-dropshot-pagination": { "required": [] } - }, - "post": { + } + }, + "/org/api-calls/{id}": { + "get": { "tags": [ - "orgs" + "api-calls" ], - "summary": "Register a new org dataset.", - "description": "If the dataset lives in S3, call `/org/dataset/s3/policies` first so you can generate the trust, permission, and bucket policies scoped to your dataset before invoking this endpoint.", - "operationId": "create_org_dataset", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateOrgDataset" - } + "summary": "Get an API call for an org.", + "description": "This endpoint requires authentication by an org admin. It returns details of the requested API call for the user's org.", + "operationId": "get_api_call_for_org", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The ID of the API call.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "successful creation", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -8494,7 +8510,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgDataset" + "$ref": "#/components/schemas/ApiCallWithPrice" } } } @@ -8507,17 +8523,19 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/org/billing/usage-collection-threshold": { + "get": { "tags": [ - "hidden" + "payments", + "orgs" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_datasets", + "summary": "Get the authenticated organization's aggregate-usage collection threshold.", + "operationId": "get_org_usage_collection_threshold", "responses": { - "204": { - "description": "resource updated", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -8583,6 +8601,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" + } + } } }, "4XX": { @@ -8593,26 +8618,24 @@ } }, "x-billable": false - } - }, - "/org/datasets/{id}": { - "get": { + }, + "put": { "tags": [ + "payments", "orgs" ], - "summary": "Fetch a single dataset by id so long as it belongs to the authenticated org.", - "operationId": "get_org_dataset", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "The identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" + "summary": "Set the authenticated organization's aggregate-usage collection threshold.", + "operationId": "set_org_usage_collection_threshold", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdSet" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -8685,7 +8708,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgDataset" + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" } } } @@ -8699,34 +8722,25 @@ }, "x-billable": false }, - "put": { + "delete": { "tags": [ + "payments", "orgs" ], - "summary": "Update dataset metadata or storage credentials for the caller's organization.", - "description": "IMPORTANT: Use this endpoint to fix connectivity to the same underlying storage location (e.g. rotating credentials or correcting a typo). Do not repoint an existing dataset at a completely different bucket or provider—create a new dataset instead so conversions in flight keep their original source. This warning applies to every storage backend, not just S3.", - "operationId": "update_org_dataset", + "summary": "Restore the default for the authenticated organization's aggregate-usage collection threshold.", + "operationId": "reset_org_usage_collection_threshold", "parameters": [ { - "in": "path", - "name": "id", - "description": "The identifier.", + "in": "query", + "name": "expected_version", + "description": "Version returned by the read that this mutation is based on.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "type": "integer", + "format": "int64" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrgDataset" - } - } - }, - "required": true - }, "responses": { "200": { "description": "successful operation", @@ -8799,7 +8813,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgDataset" + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" } } } @@ -8813,124 +8827,16 @@ }, "x-billable": false }, - "delete": { + "options": { "tags": [ - "orgs" - ], - "summary": "Delete a dataset owned by the caller's organization.", - "description": "This is a destructive operation that: - requires org admin authentication and the dataset must belong to the caller's org. - fails with a 409 Conflict if the dataset is still attached to any custom model. - deletes Zoo-managed artifacts for this dataset (converted outputs and embeddings). - does **not** delete or modify the customer's source bucket/prefix.\n\nAll internal artifact deletions are strict; if any cleanup fails, the request fails.", - "operationId": "delete_org_dataset", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "The identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - } + "hidden" ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_usage_collection_threshold", "responses": { "204": { - "description": "successful deletion", - "headers": { - "Access-Control-Allow-Credentials": { - "description": "Access-Control-Allow-Credentials header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Headers": { - "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Methods": { - "description": "Access-Control-Allow-Methods header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Origin": { - "description": "Access-Control-Allow-Origin header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Content-Location": { - "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Location": { - "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Set-Cookie": { - "description": "Set-Cookie header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "X-Api-Call-Id": { - "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", - "style": "simple", - "required": true, - "schema": { - "type": "string" - } - } - } - }, - "4XX": { - "$ref": "#/components/responses/Error" - }, - "5XX": { - "$ref": "#/components/responses/Error" - } - }, - "x-billable": false - }, - "options": { - "tags": [ - "hidden" - ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_dataset", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "The identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - } - ], - "responses": { - "204": { - "description": "successful operation, no content", + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -9008,57 +8914,36 @@ "x-billable": false } }, - "/org/datasets/{id}/bulk-download/kcl": { + "/org/dataset/s3/policies": { "get": { "tags": [ "orgs" ], - "summary": "Bulk-download KCL outputs for successful dataset conversions.", - "operationId": "download_org_dataset_successful_kcl_bulk", + "summary": "Return the IAM policies customers should apply when onboarding an S3 dataset.", + "operationId": "org_dataset_s3_policies", "parameters": [ { - "in": "path", - "name": "id", - "description": "The identifier.", + "in": "query", + "name": "uri", + "description": "Dataset URI used to scope generated IAM policies.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" - } - } - ], - "responses": { - "default": { - "description": "", - "content": { - "*/*": { - "schema": {} - } + "type": "string" } - } - }, - "x-billable": false - }, - "options": { - "tags": [ - "hidden" - ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_download_org_dataset_successful_kcl_bulk", - "parameters": [ + }, { - "in": "path", - "name": "id", - "description": "The identifier.", + "in": "query", + "name": "role_arn", + "description": "IAM role ARN customers expect Zoo to assume when reading the dataset.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "type": "string" } } ], "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -9124,6 +9009,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatasetS3Policies" + } + } } }, "4XX": { @@ -9136,24 +9028,14 @@ "x-billable": false } }, - "/org/datasets/{id}/conversions": { + "/org/datasets": { "get": { "tags": [ "orgs" ], - "summary": "List the file conversions that have been processed for a given dataset owned by the caller's org.", - "description": "This endpoint returns lightweight conversion summaries only (including `phase`), and intentionally omits converted KCL output and snapshot image payloads for speed. Use the optional `filter` query parameter to filter results (example: `?filter=status:success`). Use `q` to search by conversion id or file path and `phase` to narrow the pipeline stage.", - "operationId": "list_org_dataset_conversions", + "summary": "List every dataset that belongs to the caller's organization.", + "operationId": "list_org_datasets", "parameters": [ - { - "in": "path", - "name": "id", - "description": "The identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - }, { "in": "query", "name": "limit", @@ -9176,36 +9058,18 @@ }, { "in": "query", - "name": "sort_by", - "schema": { - "$ref": "#/components/schemas/ConversionSortMode" - } - }, - { - "in": "query", - "name": "filter", - "description": "Optional filter string for conversions (example: `status:success`).", - "schema": { - "nullable": true, - "type": "string" - } - }, - { - "in": "query", - "name": "q", - "description": "Optional search text matched against conversion id or file path.", + "name": "lookup_enabled", + "description": "When set, only return datasets with the matching lookup setting.", "schema": { "nullable": true, - "type": "string" + "type": "boolean" } }, { "in": "query", - "name": "phase", - "description": "Optional conversion phase filter.", + "name": "sort_by", "schema": { - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/CreatedAtSortMode" } } ], @@ -9281,7 +9145,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgDatasetFileConversionSummaryResultsPage" + "$ref": "#/components/schemas/OrgDatasetResultsPage" } } } @@ -9297,39 +9161,27 @@ "x-dropshot-pagination": { "required": [] } - } - }, - "/org/datasets/{id}/conversions/{conversion_id}": { - "get": { + }, + "post": { "tags": [ "orgs" ], - "summary": "Fetch the metadata and converted output for a single dataset conversion.", - "description": "Unlike list/search endpoints, this returns the full conversion payload: latest output text plus decoded snapshot image payloads for original, raw-KCL, and salon-KCL stages.", - "operationId": "get_org_dataset_conversion", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "Dataset identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" + "summary": "Register a new org dataset.", + "description": "If the dataset lives in S3, call `/org/dataset/s3/policies` first so you can generate the trust, permission, and bucket policies scoped to your dataset before invoking this endpoint.", + "operationId": "create_org_dataset", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOrgDataset" + } } }, - { - "in": "path", - "name": "conversion_id", - "description": "Conversion identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -9399,7 +9251,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgDatasetFileConversionDetails" + "$ref": "#/components/schemas/OrgDataset" } } } @@ -9412,46 +9264,6 @@ } }, "x-billable": false - } - }, - "/org/datasets/{id}/conversions/{conversion_id}/original": { - "get": { - "tags": [ - "orgs" - ], - "summary": "Download the original source file for a specific dataset conversion.", - "operationId": "download_org_dataset_conversion_original", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "Dataset identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - }, - { - "in": "path", - "name": "conversion_id", - "description": "Conversion identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - } - ], - "responses": { - "default": { - "description": "", - "content": { - "*/*": { - "schema": {} - } - } - } - }, - "x-billable": false }, "options": { "tags": [ @@ -9459,30 +9271,10 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_download_org_dataset_conversion_original", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "Dataset identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - }, - { - "in": "path", - "name": "conversion_id", - "description": "Conversion identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - } - ], + "operationId": "options_org_datasets", "responses": { "204": { - "description": "successful operation, no content", + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -9560,27 +9352,18 @@ "x-billable": false } }, - "/org/datasets/{id}/conversions/{conversion_id}/retrigger": { - "post": { + "/org/datasets/{id}": { + "get": { "tags": [ "orgs" ], - "summary": "Retrigger a specific dataset conversion for the caller's org.", - "operationId": "retrigger_org_dataset_conversion", + "summary": "Fetch a single dataset by id so long as it belongs to the authenticated org.", + "operationId": "get_org_dataset", "parameters": [ { "in": "path", "name": "id", - "description": "Dataset identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - }, - { - "in": "path", - "name": "conversion_id", - "description": "Conversion identifier.", + "description": "The identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" @@ -9588,8 +9371,8 @@ } ], "responses": { - "204": { - "description": "resource updated", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -9655,6 +9438,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrgDataset" + } + } } }, "4XX": { @@ -9666,36 +9456,37 @@ }, "x-billable": false }, - "options": { + "put": { "tags": [ - "hidden" + "orgs" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_retrigger_org_dataset_conversion", + "summary": "Update dataset metadata or storage credentials for the caller's organization.", + "description": "IMPORTANT: Use this endpoint to fix connectivity to the same underlying storage location (e.g. rotating credentials or correcting a typo). Do not repoint an existing dataset at a completely different bucket or provider—create a new dataset instead so conversions in flight keep their original source. This warning applies to every storage backend, not just S3.", + "operationId": "update_org_dataset", "parameters": [ { "in": "path", "name": "id", - "description": "Dataset identifier.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - }, - { - "in": "path", - "name": "conversion_id", - "description": "Conversion identifier.", + "description": "The identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrgDataset" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -9761,6 +9552,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrgDataset" + } + } } }, "4XX": { @@ -9771,15 +9569,14 @@ } }, "x-billable": false - } - }, - "/org/datasets/{id}/retrigger": { - "post": { + }, + "delete": { "tags": [ "orgs" ], - "summary": "Request a retrigger of conversions for a dataset that belongs to the caller's org.", - "operationId": "retrigger_org_dataset", + "summary": "Delete a dataset owned by the caller's organization.", + "description": "This is a destructive operation that: - requires org admin authentication and the dataset must belong to the caller's org. - fails with a 409 Conflict if the dataset is still attached to any custom model. - deletes Zoo-managed artifacts for this dataset (converted outputs and embeddings). - does **not** delete or modify the customer's source bucket/prefix.\n\nAll internal artifact deletions are strict; if any cleanup fails, the request fails.", + "operationId": "delete_org_dataset", "parameters": [ { "in": "path", @@ -9789,20 +9586,11 @@ "schema": { "$ref": "#/components/schemas/Uuid" } - }, - { - "in": "query", - "name": "statuses", - "description": "Optional comma-separated set of conversion statuses to retrigger.\n\nExample: `statuses=success,in_progress` If omitted, we retrigger all non-success conversions, but only retrigger `in_progress` conversions that have been running for more than 5 minutes.", - "schema": { - "nullable": true, - "type": "string" - } } ], "responses": { "204": { - "description": "resource updated", + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -9885,7 +9673,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_retrigger_org_dataset", + "operationId": "options_org_dataset", "parameters": [ { "in": "path", @@ -9977,14 +9765,13 @@ "x-billable": false } }, - "/org/datasets/{id}/search/conversions": { + "/org/datasets/{id}/bulk-download/kcl": { "get": { "tags": [ "orgs" ], - "summary": "Search dataset conversions by conversion ID or file path.", - "description": "Supports exact conversion-ID matching and fuzzy file-path matching.", - "operationId": "search_org_dataset_conversions", + "summary": "Bulk-download KCL outputs for successful dataset conversions.", + "operationId": "download_org_dataset_successful_kcl_bulk", "parameters": [ { "in": "path", @@ -9994,65 +9781,41 @@ "schema": { "$ref": "#/components/schemas/Uuid" } - }, - { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", - "schema": { - "nullable": true, - "type": "string" - } - }, - { - "in": "query", - "name": "q", - "description": "Search text matched against conversion id or file path.", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "sort_by", - "description": "Requested sort mode for matched conversions.", - "schema": { - "$ref": "#/components/schemas/ConversionSortMode" - } - }, - { - "in": "query", - "name": "filter", - "description": "Optional filter string for conversions (example: `status:success`).", - "schema": { - "nullable": true, - "type": "string" + } + ], + "responses": { + "default": { + "description": "", + "content": { + "*/*": { + "schema": {} + } } - }, + } + }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_download_org_dataset_successful_kcl_bulk", + "parameters": [ { - "in": "query", - "name": "phase", - "description": "Optional conversion phase filter.", + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, "schema": { - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/Uuid" } } ], "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -10118,13 +9881,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OrgDatasetFileConversionSummaryResultsPage" - } - } } }, "4XX": { @@ -10134,22 +9890,17 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [ - "q" - ] - } + "x-billable": false } }, - "/org/datasets/{id}/search/semantic": { + "/org/datasets/{id}/conversions": { "get": { "tags": [ "orgs" ], - "summary": "Run semantic search across chunked conversion outputs for a dataset.", - "description": "This embeds the query text with the org-dataset embedding model and returns top chunk matches ranked by cosine similarity.", - "operationId": "search_org_dataset_semantic", + "summary": "List the file conversions that have been processed for a given dataset owned by the caller's org.", + "description": "This endpoint returns lightweight conversion summaries only (including `phase`), and intentionally omits converted KCL output and snapshot image payloads for speed. Use the optional `filter` query parameter to filter results (example: `?filter=status:success`). Use `q` to search by conversion id or file path and `phase` to narrow the pipeline stage.", + "operationId": "list_org_dataset_conversions", "parameters": [ { "in": "path", @@ -10160,24 +9911,58 @@ "$ref": "#/components/schemas/Uuid" } }, + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/ConversionSortMode" + } + }, + { + "in": "query", + "name": "filter", + "description": "Optional filter string for conversions (example: `status:success`).", + "schema": { + "nullable": true, + "type": "string" + } + }, { "in": "query", "name": "q", - "description": "Natural-language query text to embed and search.", - "required": true, + "description": "Optional search text matched against conversion id or file path.", "schema": { + "nullable": true, "type": "string" } }, { "in": "query", - "name": "limit", - "description": "Max number of matching chunks to return.\n\nDefaults to 10 and is capped at 100.", + "name": "phase", + "description": "Optional conversion phase filter.", "schema": { "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 0 + "type": "string" } } ], @@ -10253,11 +10038,7 @@ "content": { "application/json": { "schema": { - "title": "Array_of_OrgDatasetSemanticSearchMatch", - "type": "array", - "items": { - "$ref": "#/components/schemas/OrgDatasetSemanticSearchMatch" - } + "$ref": "#/components/schemas/OrgDatasetFileConversionSummaryResultsPage" } } } @@ -10269,21 +10050,34 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } } }, - "/org/datasets/{id}/stats": { + "/org/datasets/{id}/conversions/{conversion_id}": { "get": { "tags": [ "orgs" ], - "summary": "Return aggregate conversion stats for a dataset owned by the caller's org.", - "operationId": "get_org_dataset_conversion_stats", + "summary": "Fetch the metadata and converted output for a single dataset conversion.", + "description": "Unlike list/search endpoints, this returns the full conversion payload: latest output text plus decoded snapshot image payloads for original, raw-KCL, and salon-KCL stages.", + "operationId": "get_org_dataset_conversion", "parameters": [ { "in": "path", "name": "id", - "description": "The identifier.", + "description": "Dataset identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "path", + "name": "conversion_id", + "description": "Conversion identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" @@ -10362,7 +10156,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgDatasetConversionStatsResponse" + "$ref": "#/components/schemas/OrgDatasetFileConversionDetails" } } } @@ -10377,39 +10171,75 @@ "x-billable": false } }, - "/org/datasets/{id}/uploads": { - "post": { + "/org/datasets/{id}/conversions/{conversion_id}/original": { + "get": { "tags": [ "orgs" ], - "summary": "Upload source files into a Zoo-managed dataset.", - "description": "This endpoint accepts `multipart/form-data` where each file part becomes a source object in the dataset. Exact `.json` converter dumps are also accepted and associated with their original CAD file. Paths are normalized and must be relative.", - "operationId": "upload_org_dataset_files", + "summary": "Download the original source file for a specific dataset conversion.", + "operationId": "download_org_dataset_conversion_original", "parameters": [ { "in": "path", "name": "id", - "description": "The identifier.", + "description": "Dataset identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "path", + "name": "conversion_id", + "description": "Conversion identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" } } ], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "string", - "format": "binary" + "responses": { + "default": { + "description": "", + "content": { + "*/*": { + "schema": {} } } - }, - "required": true + } }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_download_org_dataset_conversion_original", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "Dataset identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "path", + "name": "conversion_id", + "description": "Conversion identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], "responses": { - "202": { - "description": "successfully enqueued operation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -10475,13 +10305,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UploadOrgDatasetFilesResponse" - } - } } }, "4XX": { @@ -10492,19 +10315,29 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/org/datasets/{id}/conversions/{conversion_id}/retrigger": { + "post": { "tags": [ - "hidden" + "orgs" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_upload_org_dataset_files", + "summary": "Retrigger a specific dataset conversion for the caller's org.", + "operationId": "retrigger_org_dataset_conversion", "parameters": [ { "in": "path", "name": "id", - "description": "The identifier.", + "description": "Dataset identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "path", + "name": "conversion_id", + "description": "Conversion identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" @@ -10513,7 +10346,7 @@ ], "responses": { "204": { - "description": "successful operation, no content", + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -10589,144 +10422,37 @@ } }, "x-billable": false - } - }, - "/org/factory/jobs": { - "get": { + }, + "options": { "tags": [ - "factory" + "hidden" ], - "summary": "List Factory jobs owned by your organization.", - "description": "Any current organization member can list its jobs, including archived jobs. Ownership uses the job's stored organization, so a submitter leaving or deleting their account does not move the job. Former members lose access. Results are paginated, newest first by default, with the job id breaking ties. Internal communication, financial details, and file storage locations are omitted.", - "operationId": "list_org_factory_jobs", + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_retrigger_org_dataset_conversion", "parameters": [ { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", + "in": "path", + "name": "id", + "description": "Dataset identifier.", + "required": true, "schema": { - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/Uuid" } }, { - "in": "query", - "name": "sort_by", + "in": "path", + "name": "conversion_id", + "description": "Conversion identifier.", + "required": true, "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "headers": { - "Access-Control-Allow-Credentials": { - "description": "Access-Control-Allow-Credentials header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Headers": { - "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Methods": { - "description": "Access-Control-Allow-Methods header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Origin": { - "description": "Access-Control-Allow-Origin header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Content-Location": { - "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Location": { - "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Set-Cookie": { - "description": "Set-Cookie header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "X-Api-Call-Id": { - "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", - "style": "simple", - "required": true, - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FactoryCustomerJobSummaryResultsPage" - } - } + "$ref": "#/components/schemas/Uuid" } - }, - "4XX": { - "$ref": "#/components/responses/Error" - }, - "5XX": { - "$ref": "#/components/responses/Error" } - }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } - }, - "options": { - "tags": [ - "hidden" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_list_org_factory_jobs", "responses": { "204": { - "description": "resource updated", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -10804,27 +10530,36 @@ "x-billable": false } }, - "/org/factory/jobs/{job_id}": { - "get": { + "/org/datasets/{id}/retrigger": { + "post": { "tags": [ - "factory" + "orgs" ], - "summary": "Get an organization-owned Factory job for any current member.", - "operationId": "get_org_factory_job", + "summary": "Request a retrigger of conversions for a dataset that belongs to the caller's org.", + "operationId": "retrigger_org_dataset", "parameters": [ { "in": "path", - "name": "job_id", - "description": "The requested job's identifier.", + "name": "id", + "description": "The identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" } + }, + { + "in": "query", + "name": "statuses", + "description": "Optional comma-separated set of conversion statuses to retrigger.\n\nExample: `statuses=success,in_progress` If omitted, we retrigger all non-success conversions, but only retrigger `in_progress` conversions that have been running for more than 5 minutes.", + "schema": { + "nullable": true, + "type": "string" + } } ], "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -10890,13 +10625,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FactoryCustomerJobDetail" - } - } } }, "4XX": { @@ -10914,12 +10642,12 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_get_org_factory_job", + "operationId": "options_retrigger_org_dataset", "parameters": [ { "in": "path", - "name": "job_id", - "description": "The requested job's identifier.", + "name": "id", + "description": "The identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" @@ -11006,15 +10734,24 @@ "x-billable": false } }, - "/org/members": { + "/org/datasets/{id}/search/conversions": { "get": { "tags": [ "orgs" ], - "summary": "List members of your org.", - "description": "This endpoint requires authentication by an org admin. It lists the members of the authenticated user's org.", - "operationId": "list_org_members", + "summary": "Search dataset conversions by conversion ID or file path.", + "description": "Supports exact conversion-ID matching and fuzzy file-path matching.", + "operationId": "search_org_dataset_conversions", "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, { "in": "query", "name": "limit", @@ -11035,19 +10772,38 @@ "type": "string" } }, + { + "in": "query", + "name": "q", + "description": "Search text matched against conversion id or file path.", + "schema": { + "type": "string" + } + }, { "in": "query", "name": "sort_by", + "description": "Requested sort mode for matched conversions.", "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" + "$ref": "#/components/schemas/ConversionSortMode" } }, { "in": "query", - "name": "role", - "description": "The organization role to filter by.", + "name": "filter", + "description": "Optional filter string for conversions (example: `status:success`).", "schema": { - "$ref": "#/components/schemas/UserOrgRole" + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "phase", + "description": "Optional conversion phase filter.", + "schema": { + "nullable": true, + "type": "string" } } ], @@ -11123,7 +10879,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgMemberResultsPage" + "$ref": "#/components/schemas/OrgDatasetFileConversionSummaryResultsPage" } } } @@ -11137,29 +10893,54 @@ }, "x-billable": false, "x-dropshot-pagination": { - "required": [] + "required": [ + "q" + ] } - }, - "post": { + } + }, + "/org/datasets/{id}/search/semantic": { + "get": { "tags": [ "orgs" ], - "summary": "Add a member to your org.", - "description": "If the user exists, this will add them to your org. If they do not exist, this will create a new user and add them to your org.\n\nIn both cases the user gets an email that they have been added to the org.\n\nIf the user is already in your org, this will return a 400 and a message.\n\nIf the user is already in a different org, this will return a 400 and a message.\n\nThis endpoint requires authentication by an org admin. It adds the specified member to the authenticated user's org.", - "operationId": "create_org_member", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddOrgMember" - } + "summary": "Run semantic search across chunked conversion outputs for a dataset.", + "description": "This embeds the query text with the org-dataset embedding model and returns top chunk matches ranked by cosine similarity.", + "operationId": "search_org_dataset_semantic", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" } }, - "required": true - }, + { + "in": "query", + "name": "q", + "description": "Natural-language query text to embed and search.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "description": "Max number of matching chunks to return.\n\nDefaults to 10 and is capped at 100.", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 0 + } + } + ], "responses": { - "201": { - "description": "successful creation", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -11229,7 +11010,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgMember" + "title": "Array_of_OrgDatasetSemanticSearchMatch", + "type": "array", + "items": { + "$ref": "#/components/schemas/OrgDatasetSemanticSearchMatch" + } } } } @@ -11242,17 +11027,29 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/org/datasets/{id}/stats": { + "get": { "tags": [ - "hidden" + "orgs" + ], + "summary": "Return aggregate conversion stats for a dataset owned by the caller's org.", + "operationId": "get_org_dataset_conversion_stats", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_member", "responses": { - "204": { - "description": "resource updated", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -11318,6 +11115,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrgDatasetConversionStatsResponse" + } + } } }, "4XX": { @@ -11330,28 +11134,39 @@ "x-billable": false } }, - "/org/members/{user_id}": { - "get": { + "/org/datasets/{id}/uploads": { + "post": { "tags": [ "orgs" ], - "summary": "Get a member of your org.", - "description": "This endpoint requires authentication by an org admin. It gets the specified member of the authenticated user's org.", - "operationId": "get_org_member", + "summary": "Upload source files into a Zoo-managed dataset.", + "description": "This endpoint accepts `multipart/form-data` where each file part becomes a source object in the dataset. Exact `.json` converter dumps are also accepted and associated with their original CAD file. Paths are normalized and must be relative.", + "operationId": "upload_org_dataset_files", "parameters": [ { "in": "path", - "name": "user_id", - "description": "The user id of the org member.", + "name": "id", + "description": "The identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" } } ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "string", + "format": "binary" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "202": { + "description": "successfully enqueued operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -11421,7 +11236,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgMember" + "$ref": "#/components/schemas/UploadOrgDatasetFilesResponse" } } } @@ -11435,37 +11250,27 @@ }, "x-billable": false }, - "put": { + "options": { "tags": [ - "orgs" + "hidden" ], - "summary": "Update a member of your org.", - "description": "This endpoint requires authentication by an org admin. It updates the specified member of the authenticated user's org.", - "operationId": "update_org_member", + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_upload_org_dataset_files", "parameters": [ { "in": "path", - "name": "user_id", - "description": "The user id of the org member.", + "name": "id", + "description": "The identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMemberToOrgBody" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -11531,13 +11336,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OrgMember" - } - } } }, "4XX": { @@ -11548,28 +11346,48 @@ } }, "x-billable": false - }, - "delete": { + } + }, + "/org/factory/jobs": { + "get": { "tags": [ - "orgs" + "factory" ], - "summary": "Remove a member from your org.", - "description": "This endpoint requires authentication by an org admin. It removes the specified member from the authenticated user's org.", - "operationId": "delete_org_member", + "summary": "List Factory jobs owned by your organization.", + "description": "Any current organization member can list its jobs, including archived jobs. Ownership uses the job's stored organization, so a submitter leaving or deleting their account does not move the job. Former members lose access. Results are paginated, newest first by default, with the job id breaking ties. Internal communication, financial details, and file storage locations are omitted.", + "operationId": "list_org_factory_jobs", "parameters": [ { - "in": "path", - "name": "user_id", - "description": "The user id of the org member.", - "required": true, + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", "schema": { - "$ref": "#/components/schemas/Uuid" + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" } } ], "responses": { - "204": { - "description": "successful deletion", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -11635,6 +11453,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FactoryCustomerJobSummaryResultsPage" + } + } } }, "4XX": { @@ -11644,7 +11469,10 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } }, "options": { "tags": [ @@ -11652,21 +11480,10 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_update_org_member", - "parameters": [ - { - "in": "path", - "name": "user_id", - "description": "The user id of the org member.", - "required": true, - "schema": { - "$ref": "#/components/schemas/Uuid" - } - } - ], + "operationId": "options_list_org_factory_jobs", "responses": { "204": { - "description": "successful operation, no content", + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -11744,41 +11561,21 @@ "x-billable": false } }, - "/org/oauth2/apps": { + "/org/factory/jobs/{job_id}": { "get": { "tags": [ - "oauth2", - "orgs" + "factory" ], - "summary": "List org OAuth apps.", - "description": "This endpoint requires authentication by an org member. It lists the organization's active public OAuth apps.", - "operationId": "list_org_oauth2_apps", + "summary": "Get an organization-owned Factory job for any current member.", + "operationId": "get_org_factory_job", "parameters": [ { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", - "schema": { - "nullable": true, - "type": "string" - } - }, - { - "in": "query", - "name": "sort_by", + "in": "path", + "name": "job_id", + "description": "The requested job's identifier.", + "required": true, "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" + "$ref": "#/components/schemas/Uuid" } } ], @@ -11854,7 +11651,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OAuth2AppResponseResultsPage" + "$ref": "#/components/schemas/FactoryCustomerJobDetail" } } } @@ -11866,32 +11663,29 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false }, - "post": { + "options": { "tags": [ - "oauth2", - "orgs" + "hidden" ], - "summary": "Create an org OAuth app.", - "description": "This endpoint requires authentication by an org admin. It creates an active public OAuth app owned by the authenticated organization.", - "operationId": "create_org_oauth2_app", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateOAuth2AppRequest" - } + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_get_org_factory_job", + "parameters": [ + { + "in": "path", + "name": "job_id", + "description": "The requested job's identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "successful creation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -11957,13 +11751,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OAuth2AppResponse" - } - } } }, "4XX": { @@ -11974,6 +11761,46 @@ } }, "x-billable": false + } + }, + "/org/factory/jobs/{job_id}/files/{file_id}": { + "get": { + "tags": [ + "factory" + ], + "summary": "Download an exact submitted manufacturing input for a current organization member.", + "operationId": "get_org_factory_job_file", + "parameters": [ + { + "in": "path", + "name": "job_id", + "description": "Stable job identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "path", + "name": "file_id", + "description": "Submitted file identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "default": { + "description": "", + "content": { + "*/*": { + "schema": {} + } + } + } + }, + "x-billable": false }, "options": { "tags": [ @@ -11981,10 +11808,30 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_oauth2_apps", + "operationId": "options_get_org_factory_job_file", + "parameters": [ + { + "in": "path", + "name": "job_id", + "description": "Stable job identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "path", + "name": "file_id", + "description": "Submitted file identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], "responses": { "204": { - "description": "resource updated", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12062,24 +11909,49 @@ "x-billable": false } }, - "/org/oauth2/apps/{client_id}": { + "/org/factory/jobs/{job_id}/versions": { "get": { "tags": [ - "oauth2", - "orgs" + "factory" ], - "summary": "Get an org OAuth app.", - "description": "This endpoint requires authentication by an org member. It returns the organization's active public OAuth app by client ID.", - "operationId": "get_org_oauth2_app", + "summary": "List an organization's submitted revision history for a current member.", + "operationId": "list_org_factory_job_versions", "parameters": [ { "in": "path", - "name": "client_id", - "description": "The OAuth client identifier.", + "name": "job_id", + "description": "The requested job's identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" } + }, + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" + } } ], "responses": { @@ -12154,7 +12026,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OAuth2AppResponse" + "$ref": "#/components/schemas/FactoryCustomerJobVersionResultsPage" } } } @@ -12166,21 +12038,22 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } }, - "put": { + "post": { "tags": [ - "oauth2", - "orgs" + "factory" ], - "summary": "Update an org OAuth app.", - "description": "This endpoint requires authentication by an org admin. It updates the configuration of the organization's active public OAuth app.", - "operationId": "update_org_oauth2_app", + "summary": "Submit a complete new revision as a current human member of the owning organization.", + "operationId": "create_org_factory_job_version", "parameters": [ { "in": "path", - "name": "client_id", - "description": "The OAuth client identifier.", + "name": "job_id", + "description": "The requested job's identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" @@ -12189,17 +12062,18 @@ ], "requestBody": { "content": { - "application/json": { + "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/UpdateOAuth2AppRequest" + "type": "string", + "format": "binary" } } }, "required": true }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12269,7 +12143,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OAuth2AppResponse" + "$ref": "#/components/schemas/FactoryJobResponse" } } } @@ -12283,19 +12157,18 @@ }, "x-billable": false }, - "delete": { + "options": { "tags": [ - "oauth2", - "orgs" + "hidden" ], - "summary": "Delete an org OAuth app.", - "description": "This endpoint requires authentication by an org admin. It deactivates the organization's active public OAuth app.", - "operationId": "delete_org_oauth2_app", + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_create_org_factory_job_version", "parameters": [ { "in": "path", - "name": "client_id", - "description": "The OAuth client identifier.", + "name": "job_id", + "description": "The requested job's identifier.", "required": true, "schema": { "$ref": "#/components/schemas/Uuid" @@ -12304,7 +12177,7 @@ ], "responses": { "204": { - "description": "successful deletion", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12380,28 +12253,56 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/org/members": { + "get": { "tags": [ - "hidden" + "orgs" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_oauth2_app", + "summary": "List members of your org.", + "description": "This endpoint requires authentication by an org admin. It lists the members of the authenticated user's org.", + "operationId": "list_org_members", "parameters": [ { - "in": "path", - "name": "client_id", - "description": "The OAuth client identifier.", - "required": true, + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", "schema": { - "$ref": "#/components/schemas/Uuid" + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" + } + }, + { + "in": "query", + "name": "role", + "description": "The organization role to filter by.", + "schema": { + "$ref": "#/components/schemas/UserOrgRole" } } ], "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12467,6 +12368,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrgMemberResultsPage" + } + } } }, "4XX": { @@ -12476,20 +12384,31 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false - } - }, - "/org/payment": { - "get": { + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, + "post": { "tags": [ - "payments" + "orgs" ], - "summary": "Get payment info about your org.", - "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by an org admin. It gets the payment information for the authenticated user's org.", - "operationId": "get_payment_information_for_org", + "summary": "Add a member to your org.", + "description": "If the user exists, this will add them to your org. If they do not exist, this will create a new user and add them to your org.\n\nIn both cases the user gets an email that they have been added to the org.\n\nIf the user is already in your org, this will return a 400 and a message.\n\nIf the user is already in a different org, this will return a 400 and a message.\n\nThis endpoint requires authentication by an org admin. It adds the specified member to the authenticated user's org.", + "operationId": "create_org_member", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOrgMember" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12559,7 +12478,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Customer" + "$ref": "#/components/schemas/OrgMember" } } } @@ -12573,26 +12492,115 @@ }, "x-billable": false }, - "put": { + "options": { "tags": [ - "payments" + "hidden" ], - "summary": "Update payment info for your org.", - "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by an org admin. It updates the payment information for the authenticated user's org.", - "operationId": "update_payment_information_for_org", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BillingInfo" - } - } - }, - "required": true - }, + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_member", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/org/members/{user_id}": { + "get": { + "tags": [ + "orgs" + ], + "summary": "Get a member of your org.", + "description": "This endpoint requires authentication by an org admin. It gets the specified member of the authenticated user's org.", + "operationId": "get_org_member", + "parameters": [ + { + "in": "path", + "name": "user_id", + "description": "The user id of the org member.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12662,7 +12670,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Customer" + "$ref": "#/components/schemas/OrgMember" } } } @@ -12676,26 +12684,37 @@ }, "x-billable": false }, - "post": { + "put": { "tags": [ - "payments" + "orgs" + ], + "summary": "Update a member of your org.", + "description": "This endpoint requires authentication by an org admin. It updates the specified member of the authenticated user's org.", + "operationId": "update_org_member", + "parameters": [ + { + "in": "path", + "name": "user_id", + "description": "The user id of the org member.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } ], - "summary": "Create payment info for your org.", - "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by the org admin. It creates the payment information for the authenticated user's org.", - "operationId": "create_payment_information_for_org", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/BillingInfo" + "$ref": "#/components/schemas/UpdateMemberToOrgBody" } } }, "required": true }, "responses": { - "201": { - "description": "successful creation", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12765,7 +12784,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Customer" + "$ref": "#/components/schemas/OrgMember" } } } @@ -12781,11 +12800,22 @@ }, "delete": { "tags": [ - "payments" + "orgs" + ], + "summary": "Remove a member from your org.", + "description": "This endpoint requires authentication by an org admin. It removes the specified member from the authenticated user's org.", + "operationId": "delete_org_member", + "parameters": [ + { + "in": "path", + "name": "user_id", + "description": "The user id of the org member.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } ], - "summary": "Delete payment info for your org.", - "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by an org admin. It deletes the payment information for the authenticated user's org.", - "operationId": "delete_payment_information_for_org", "responses": { "204": { "description": "successful deletion", @@ -12871,10 +12901,21 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_payment_information_for_org", + "operationId": "options_update_org_member", + "parameters": [ + { + "in": "path", + "name": "user_id", + "description": "The user id of the org member.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], "responses": { "204": { - "description": "resource updated", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -12952,21 +12993,41 @@ "x-billable": false } }, - "/org/payment/balance": { + "/org/oauth2/apps": { "get": { "tags": [ - "payments" + "oauth2", + "orgs" ], - "summary": "Get balance for your org.", - "description": "This endpoint requires authentication by any member of an org. It gets the balance information for the authenticated user's org.", - "operationId": "get_payment_balance_for_org", + "summary": "List org OAuth apps.", + "description": "This endpoint requires authentication by an org member. It lists the organization's active public OAuth apps.", + "operationId": "list_org_oauth2_apps", "parameters": [ { "in": "query", - "name": "include_total_due", - "description": "Return both recorded charges (`total_due`) and estimated cash charges after available usage credits (`amount_due_after_credits`). This makes the API call take longer so it is off by default.", + "name": "limit", + "description": "Maximum number of items returned by a single call", "schema": { - "type": "boolean" + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" } } ], @@ -13042,7 +13103,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomerBalance" + "$ref": "#/components/schemas/OAuth2AppResponseResultsPage" } } } @@ -13054,18 +13115,29 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false - } - }, - "/org/payment/intent": { + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, "post": { "tags": [ - "payments", - "hidden" + "oauth2", + "orgs" ], - "summary": "Create a payment intent for your org.", - "description": "This endpoint requires authentication by the org admin. It creates a new payment intent for the authenticated user's org's org.", - "operationId": "create_payment_intent_for_org", + "summary": "Create an org OAuth app.", + "description": "This endpoint requires authentication by an org admin. It creates an active public OAuth app owned by the authenticated organization.", + "operationId": "create_org_oauth2_app", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOAuth2AppRequest" + } + } + }, + "required": true + }, "responses": { "201": { "description": "successful creation", @@ -13138,7 +13210,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaymentIntent" + "$ref": "#/components/schemas/OAuth2AppResponse" } } } @@ -13158,7 +13230,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_payment_intent_for_org", + "operationId": "options_org_oauth2_apps", "responses": { "204": { "description": "resource updated", @@ -13239,33 +13311,23 @@ "x-billable": false } }, - "/org/payment/invoices": { + "/org/oauth2/apps/{client_id}": { "get": { "tags": [ - "payments" + "oauth2", + "orgs" ], - "summary": "List invoices for your org.", - "description": "This endpoint requires authentication by an org admin. It lists invoices for the authenticated user's org.", - "operationId": "list_invoices_for_org", + "summary": "Get an org OAuth app.", + "description": "This endpoint requires authentication by an org member. It returns the organization's active public OAuth app by client ID.", + "operationId": "get_org_oauth2_app", "parameters": [ { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", + "in": "path", + "name": "client_id", + "description": "The OAuth client identifier.", + "required": true, "schema": { - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/Uuid" } } ], @@ -13341,7 +13403,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InvoiceResultsPage" + "$ref": "#/components/schemas/OAuth2AppResponse" } } } @@ -13353,121 +13415,40 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } - } - }, - "/org/payment/method-portal-link": { - "get": { + "x-billable": false + }, + "put": { "tags": [ - "payments" + "oauth2", + "orgs" ], - "summary": "Redirect to a fresh Stripe-hosted payment-method update link for your org.", - "description": "If the request is not authenticated, this redirects to website login with a callback back to this endpoint. If authenticated as an org admin, it creates a fresh hosted Stripe portal session and redirects the browser to it.", - "operationId": "redirect_payment_method_portal_link_for_org", + "summary": "Update an org OAuth app.", + "description": "This endpoint requires authentication by an org admin. It updates the configuration of the organization's active public OAuth app.", + "operationId": "update_org_oauth2_app", "parameters": [ { - "in": "query", - "name": "return_url", - "description": "The URL Stripe should offer after the hosted flow completes.\n\nIf omitted, this defaults to the account page.", + "in": "path", + "name": "client_id", + "description": "The OAuth client identifier.", + "required": true, "schema": { - "nullable": true, - "type": "string", - "format": "uri" + "$ref": "#/components/schemas/Uuid" } } ], - "responses": { - "302": { - "description": "Temporary Redirect", - "headers": { - "Access-Control-Allow-Credentials": { - "description": "Access-Control-Allow-Credentials header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Headers": { - "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Methods": { - "description": "Access-Control-Allow-Methods header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Origin": { - "description": "Access-Control-Allow-Origin header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Content-Location": { - "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Location": { - "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Set-Cookie": { - "description": "Set-Cookie header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "X-Api-Call-Id": { - "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", - "style": "simple", - "required": true, - "schema": { - "type": "string" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOAuth2AppRequest" } } }, - "4XX": { - "$ref": "#/components/responses/Error" - }, - "5XX": { - "$ref": "#/components/responses/Error" - } + "required": true }, - "x-billable": false - }, - "options": { - "tags": [ - "hidden" - ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_payment_method_portal_link_for_org", "responses": { - "204": { - "description": "resource updated", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -13533,6 +13514,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuth2AppResponse" + } + } } }, "4XX": { @@ -13543,41 +13531,29 @@ } }, "x-billable": false - } - }, - "/org/payment/methods": { - "get": { + }, + "delete": { "tags": [ - "payments" + "oauth2", + "orgs" ], - "summary": "List payment methods for your org.", - "description": "This endpoint requires authentication by an org admin. It lists payment methods for the authenticated user's org, with the valid default card first.", - "operationId": "list_payment_methods_for_org", + "summary": "Delete an org OAuth app.", + "description": "This endpoint requires authentication by an org admin. It deactivates the organization's active public OAuth app.", + "operationId": "delete_org_oauth2_app", "parameters": [ { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", + "in": "path", + "name": "client_id", + "description": "The OAuth client identifier.", + "required": true, "schema": { - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/Uuid" } } ], "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -13643,13 +13619,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaymentMethodResultsPage" - } - } } }, "4XX": { @@ -13659,35 +13628,29 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } - } - }, - "/org/payment/methods/{id}": { - "delete": { + "x-billable": false + }, + "options": { "tags": [ - "payments", "hidden" ], - "summary": "Delete a payment method for your org.", - "description": "This endpoint requires authentication by an org admin. It deletes the specified payment method for the authenticated user's org.", - "operationId": "delete_payment_method_for_org", + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_oauth2_app", "parameters": [ { "in": "path", - "name": "id", - "description": "Stripe payment method identifier.", + "name": "client_id", + "description": "The OAuth client identifier.", "required": true, "schema": { - "type": "string" + "$ref": "#/components/schemas/Uuid" } } ], "responses": { "204": { - "description": "successful deletion", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -13763,28 +13726,19 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/org/payment": { + "get": { "tags": [ - "hidden" - ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_payment_methods_for_org", - "parameters": [ - { - "in": "path", - "name": "id", - "description": "Stripe payment method identifier.", - "required": true, - "schema": { - "type": "string" - } - } + "payments" ], + "summary": "Get payment info about your org.", + "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by an org admin. It gets the payment information for the authenticated user's org.", + "operationId": "get_payment_information_for_org", "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -13850,6 +13804,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Customer" + } + } } }, "4XX": { @@ -13860,16 +13821,24 @@ } }, "x-billable": false - } - }, - "/org/payment/subscriptions": { - "get": { + }, + "put": { "tags": [ "payments" ], - "summary": "Get the subscription for an org.", - "description": "This endpoint requires authentication by any member of an org. It gets the subscription for the authenticated user's org.", - "operationId": "get_org_subscription", + "summary": "Update payment info for your org.", + "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by an org admin. It updates the payment information for the authenticated user's org.", + "operationId": "update_payment_information_for_org", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BillingInfo" + } + } + }, + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -13942,7 +13911,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ZooProductSubscriptions" + "$ref": "#/components/schemas/Customer" } } } @@ -13956,26 +13925,26 @@ }, "x-billable": false }, - "put": { + "post": { "tags": [ "payments" ], - "summary": "Update the subscription for an org.", - "description": "This endpoint requires authentication by an org admin. It updates the subscription for the authenticated user's org.", - "operationId": "update_org_subscription", + "summary": "Create payment info for your org.", + "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by the org admin. It creates the payment information for the authenticated user's org.", + "operationId": "create_payment_information_for_org", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ZooProductSubscriptionsOrgRequest" + "$ref": "#/components/schemas/BillingInfo" } } }, "required": true }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -14045,7 +14014,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ZooProductSubscriptions" + "$ref": "#/components/schemas/Customer" } } } @@ -14059,26 +14028,16 @@ }, "x-billable": false }, - "post": { + "delete": { "tags": [ "payments" ], - "summary": "Create the subscription for an org.", - "description": "This endpoint requires authentication by an org admin. It creates the subscription for the authenticated user's org.", - "operationId": "create_org_subscription", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ZooProductSubscriptionsOrgRequest" - } - } - }, - "required": true - }, + "summary": "Delete payment info for your org.", + "description": "This includes billing address, phone, and name.\n\nThis endpoint requires authentication by an org admin. It deletes the payment information for the authenticated user's org.", + "operationId": "delete_payment_information_for_org", "responses": { - "201": { - "description": "successful creation", + "204": { + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -14144,13 +14103,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ZooProductSubscriptions" - } - } } }, "4XX": { @@ -14168,7 +14120,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_subscription", + "operationId": "options_payment_information_for_org", "responses": { "204": { "description": "resource updated", @@ -14249,103 +14201,24 @@ "x-billable": false } }, - "/org/payment/tax": { + "/org/payment/balance": { "get": { "tags": [ - "payments", - "hidden" + "payments" ], - "summary": "Validate an orgs's information is correct and valid for automatic tax.", - "description": "This endpoint requires authentication by an org admin. It will return an error if the org's information is not valid for automatic tax. Otherwise, it will return an empty successful response.", - "operationId": "validate_customer_tax_information_for_org", - "responses": { - "204": { - "description": "successful operation, no content", - "headers": { - "Access-Control-Allow-Credentials": { - "description": "Access-Control-Allow-Credentials header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Headers": { - "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Methods": { - "description": "Access-Control-Allow-Methods header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Origin": { - "description": "Access-Control-Allow-Origin header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Content-Location": { - "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Location": { - "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Set-Cookie": { - "description": "Set-Cookie header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "X-Api-Call-Id": { - "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", - "style": "simple", - "required": true, - "schema": { - "type": "string" - } - } + "summary": "Get balance for your org.", + "description": "This endpoint requires authentication by any member of an org. It gets the balance information for the authenticated user's org.", + "operationId": "get_payment_balance_for_org", + "parameters": [ + { + "in": "query", + "name": "include_total_due", + "description": "Return both recorded charges (`total_due`) and estimated cash charges after available usage credits (`amount_due_after_credits`). This makes the API call take longer so it is off by default.", + "schema": { + "type": "boolean" } - }, - "4XX": { - "$ref": "#/components/responses/Error" - }, - "5XX": { - "$ref": "#/components/responses/Error" } - }, - "x-billable": false - } - }, - "/org/privacy": { - "get": { - "tags": [ - "orgs" ], - "summary": "Get the privacy settings for an org.", - "description": "This endpoint requires authentication by an org admin. It gets the privacy settings for the authenticated user's org.", - "operationId": "get_org_privacy_settings", "responses": { "200": { "description": "successful operation", @@ -14418,7 +14291,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PrivacySettings" + "$ref": "#/components/schemas/CustomerBalance" } } } @@ -14431,27 +14304,20 @@ } }, "x-billable": false - }, - "put": { + } + }, + "/org/payment/intent": { + "post": { "tags": [ - "orgs" + "payments", + "hidden" ], - "summary": "Update the privacy settings for an org.", - "description": "This endpoint requires authentication by an org admin. It updates the privacy settings for the authenticated user's org.", - "operationId": "update_org_privacy_settings", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PrivacySettings" - } - } - }, - "required": true - }, + "summary": "Create a payment intent for your org.", + "description": "This endpoint requires authentication by the org admin. It creates a new payment intent for the authenticated user's org's org.", + "operationId": "create_payment_intent_for_org", "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -14521,7 +14387,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PrivacySettings" + "$ref": "#/components/schemas/PaymentIntent" } } } @@ -14541,7 +14407,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_privacy_settings", + "operationId": "options_payment_intent_for_org", "responses": { "204": { "description": "resource updated", @@ -14622,24 +14488,36 @@ "x-billable": false } }, - "/org/projects/search/semantic": { - "post": { + "/org/payment/invoices": { + "get": { "tags": [ - "projects" + "payments" ], - "summary": "Search current projects shared with the authenticated user's organization.", - "description": "Results are ranked by similarity to bounded project metadata: title, description, and a capped list of source filenames. Project source contents are not indexed. Projects become searchable asynchronously after saving or changing organization ownership. Personal projects and obsolete versions are excluded. Pass `library_id` to search one named organization library.", - "operationId": "search_org_projects_semantic", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectSemanticSearchRequest" - } + "summary": "List invoices for your org.", + "description": "This endpoint requires authentication by an org admin. It lists invoices for the authenticated user's org.", + "operationId": "list_invoices_for_org", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 } }, - "required": true - }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + } + ], "responses": { "200": { "description": "successful operation", @@ -14712,11 +14590,7 @@ "content": { "application/json": { "schema": { - "title": "Array_of_ProjectSemanticSearchMatch", - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectSemanticSearchMatch" - } + "$ref": "#/components/schemas/InvoiceResultsPage" } } } @@ -14728,18 +14602,35 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false - }, - "options": { + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + } + }, + "/org/payment/method-portal-link": { + "get": { "tags": [ - "hidden" + "payments" + ], + "summary": "Redirect to a fresh Stripe-hosted payment-method update link for your org.", + "description": "If the request is not authenticated, this redirects to website login with a callback back to this endpoint. If authenticated as an org admin, it creates a fresh hosted Stripe portal session and redirects the browser to it.", + "operationId": "redirect_payment_method_portal_link_for_org", + "parameters": [ + { + "in": "query", + "name": "return_url", + "description": "The URL Stripe should offer after the hosted flow completes.\n\nIf omitted, this defaults to the account page.", + "schema": { + "nullable": true, + "type": "string", + "format": "uri" + } + } ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_projects_semantic_search", "responses": { - "204": { - "description": "resource updated", + "302": { + "description": "Temporary Redirect", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -14815,19 +14706,17 @@ } }, "x-billable": false - } - }, - "/org/saml/idp": { - "get": { + }, + "options": { "tags": [ - "orgs" + "hidden" ], - "summary": "Get the SAML identity provider.", - "description": "This endpoint requires authentication by an org admin.", - "operationId": "get_org_saml_idp", + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_payment_method_portal_link_for_org", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -14893,13 +14782,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SamlIdentityProvider" - } - } } }, "4XX": { @@ -14910,24 +14792,38 @@ } }, "x-billable": false - }, - "put": { + } + }, + "/org/payment/methods": { + "get": { "tags": [ - "orgs" + "payments" ], - "summary": "Update the SAML identity provider.", - "description": "This endpoint requires authentication by an org admin.", - "operationId": "update_org_saml_idp", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SamlIdentityProviderCreate" - } + "summary": "List payment methods for your org.", + "description": "This endpoint requires authentication by an org admin. It lists payment methods for the authenticated user's org, with the valid default card first.", + "operationId": "list_payment_methods_for_org", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 } }, - "required": true - }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + } + ], "responses": { "200": { "description": "successful operation", @@ -15000,7 +14896,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SamlIdentityProvider" + "$ref": "#/components/schemas/PaymentMethodResultsPage" } } } @@ -15012,28 +14908,35 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false - }, - "post": { + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + } + }, + "/org/payment/methods/{id}": { + "delete": { "tags": [ - "orgs" + "payments", + "hidden" ], - "summary": "Create a SAML identity provider.", - "description": "This endpoint requires authentication by an org admin.", - "operationId": "create_org_saml_idp", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SamlIdentityProviderCreate" - } + "summary": "Delete a payment method for your org.", + "description": "This endpoint requires authentication by an org admin. It deletes the specified payment method for the authenticated user's org.", + "operationId": "delete_payment_method_for_org", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "Stripe payment method identifier.", + "required": true, + "schema": { + "type": "string" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "successful creation", + "204": { + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -15099,13 +15002,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SamlIdentityProvider" - } - } } }, "4XX": { @@ -15117,16 +15013,27 @@ }, "x-billable": false }, - "delete": { + "options": { "tags": [ - "orgs" + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_payment_methods_for_org", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "Stripe payment method identifier.", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "Delete an SAML identity provider.", - "description": "This endpoint requires authentication by an org admin.", - "operationId": "delete_org_saml_idp", "responses": { "204": { - "description": "successful deletion", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -15202,17 +15109,19 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/org/payment/subscriptions": { + "get": { "tags": [ - "hidden" + "payments" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_saml_idp", + "summary": "Get the subscription for an org.", + "description": "This endpoint requires authentication by any member of an org. It gets the subscription for the authenticated user's org.", + "operationId": "get_org_subscription", "responses": { - "204": { - "description": "resource updated", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -15278,6 +15187,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ZooProductSubscriptions" + } + } } }, "4XX": { @@ -15288,45 +15204,24 @@ } }, "x-billable": false - } - }, - "/org/service-accounts": { - "get": { + }, + "put": { "tags": [ - "service-accounts" + "payments" ], - "summary": "List service accounts for your org.", - "description": "This endpoint requires authentication by an org member. It returns the service accounts for the organization.\n\nThe service accounts are returned in order of creation, with the most recently created service accounts first.", - "operationId": "list_service_accounts_for_org", - "parameters": [ - { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", - "schema": { - "nullable": true, - "type": "string" + "summary": "Update the subscription for an org.", + "description": "This endpoint requires authentication by an org admin. It updates the subscription for the authenticated user's org.", + "operationId": "update_org_subscription", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ZooProductSubscriptionsOrgRequest" + } } }, - { - "in": "query", - "name": "sort_by", - "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" - } - } - ], + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -15399,7 +15294,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ServiceAccountResultsPage" + "$ref": "#/components/schemas/ZooProductSubscriptions" } } } @@ -15411,29 +15306,25 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false }, "post": { "tags": [ - "service-accounts" + "payments" ], - "summary": "Create a new service account for your org.", - "description": "This endpoint requires authentication by an org member. It creates a new service account for the organization.", - "operationId": "create_service_account_for_org", - "parameters": [ - { - "in": "query", - "name": "label", - "description": "An optional label for the service account.", - "schema": { - "nullable": true, - "type": "string" + "summary": "Create the subscription for an org.", + "description": "This endpoint requires authentication by an org admin. It creates the subscription for the authenticated user's org.", + "operationId": "create_org_subscription", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ZooProductSubscriptionsOrgRequest" + } } - } - ], + }, + "required": true + }, "responses": { "201": { "description": "successful creation", @@ -15506,7 +15397,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ServiceAccount" + "$ref": "#/components/schemas/ZooProductSubscriptions" } } } @@ -15526,7 +15417,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_create_service_account_for_org", + "operationId": "options_org_subscription", "responses": { "204": { "description": "resource updated", @@ -15607,28 +15498,18 @@ "x-billable": false } }, - "/org/service-accounts/{token}": { + "/org/payment/tax": { "get": { "tags": [ - "service-accounts" - ], - "summary": "Get an service account for your org.", - "description": "This endpoint requires authentication by an org member. It returns details of the requested service account for the organization.", - "operationId": "get_service_account_for_org", - "parameters": [ - { - "in": "path", - "name": "token", - "description": "The service account.", - "required": true, - "schema": { - "$ref": "#/components/schemas/ServiceAccountUuid" - } - } + "payments", + "hidden" ], + "summary": "Validate an orgs's information is correct and valid for automatic tax.", + "description": "This endpoint requires authentication by an org admin. It will return an error if the org's information is not valid for automatic tax. Otherwise, it will return an empty successful response.", + "operationId": "validate_customer_tax_information_for_org", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -15694,13 +15575,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAccount" - } - } } }, "4XX": { @@ -15711,28 +15585,19 @@ } }, "x-billable": false - }, - "delete": { + } + }, + "/org/privacy": { + "get": { "tags": [ - "service-accounts" - ], - "summary": "Delete an service account for your org.", - "description": "This endpoint requires authentication by an org member. It deletes the requested service account for the organization.\n\nThis endpoint does not actually delete the service account from the database. It merely marks the token as invalid. We still want to keep the service account in the database for historical purposes.\n\nThe token path parameter can be either the full service account token (prefixed with `svc-`) or the token's unique ID (a UUID).", - "operationId": "delete_service_account_for_org", - "parameters": [ - { - "in": "path", - "name": "token", - "description": "The service account token (prefixed with `svc-`) or the token's unique ID (a UUID).", - "required": true, - "schema": { - "type": "string" - } - } + "orgs" ], + "summary": "Get the privacy settings for an org.", + "description": "This endpoint requires authentication by an org admin. It gets the privacy settings for the authenticated user's org.", + "operationId": "get_org_privacy_settings", "responses": { - "204": { - "description": "successful deletion", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -15798,6 +15663,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivacySettings" + } + } } }, "4XX": { @@ -15809,27 +15681,26 @@ }, "x-billable": false }, - "options": { + "put": { "tags": [ - "hidden" + "orgs" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_service_account_for_org", - "parameters": [ - { - "in": "path", - "name": "token", - "description": "The service account.", - "required": true, - "schema": { - "$ref": "#/components/schemas/ServiceAccountUuid" + "summary": "Update the privacy settings for an org.", + "description": "This endpoint requires authentication by an org admin. It updates the privacy settings for the authenticated user's org.", + "operationId": "update_org_privacy_settings", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivacySettings" + } } - } - ], + }, + "required": true + }, "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -15895,6 +15766,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivacySettings" + } + } } }, "4XX": { @@ -15905,49 +15783,17 @@ } }, "x-billable": false - } - }, - "/org/shortlinks": { - "get": { + }, + "options": { "tags": [ - "orgs", - "shortlinks" - ], - "summary": "Get the shortlinks for an org.", - "description": "This endpoint requires authentication by an org admin. It gets the shortlinks for the authenticated user's org.", - "operationId": "get_org_shortlinks", - "parameters": [ - { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", - "schema": { - "nullable": true, - "type": "string" - } - }, - { - "in": "query", - "name": "sort_by", - "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" - } - } + "hidden" ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_privacy_settings", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -16013,13 +15859,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ShortlinkResultsPage" - } - } } }, "4XX": { @@ -16029,41 +15868,27 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false } }, - "/org/skills": { - "get": { + "/org/projects/search/semantic": { + "post": { "tags": [ - "orgs" + "projects" ], - "summary": "List every skill that belongs to the caller's organization, ordered by name.", - "operationId": "list_org_skills", - "parameters": [ - { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 + "summary": "Search current projects shared with the authenticated user's organization.", + "description": "Results are ranked by similarity to bounded project metadata: title, description, and a capped list of source filenames. Project source contents are not indexed. Projects become searchable asynchronously after saving or changing organization ownership. Personal projects and obsolete versions are excluded. Pass `library_id` to search one named organization library.", + "operationId": "search_org_projects_semantic", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectSemanticSearchRequest" + } } }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", - "schema": { - "nullable": true, - "type": "string" - } - } - ], + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -16136,7 +15961,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrgSkillResponseResultsPage" + "title": "Array_of_ProjectSemanticSearchMatch", + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectSemanticSearchMatch" + } } } } @@ -16148,10 +15977,7 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false }, "options": { "tags": [ @@ -16159,7 +15985,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_org_skills", + "operationId": "options_org_projects_semantic_search", "responses": { "204": { "description": "resource updated", @@ -16240,13 +16066,14 @@ "x-billable": false } }, - "/ping": { + "/org/saml/idp": { "get": { "tags": [ - "meta" + "orgs" ], - "summary": "Return pong.", - "operationId": "ping", + "summary": "Get the SAML identity provider.", + "description": "This endpoint requires authentication by an org admin.", + "operationId": "get_org_saml_idp", "responses": { "200": { "description": "successful operation", @@ -16319,7 +16146,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Pong" + "$ref": "#/components/schemas/SamlIdentityProvider" } } } @@ -16332,17 +16159,24 @@ } }, "x-billable": false - } - }, - "/pricing/subscriptions": { - "get": { + }, + "put": { "tags": [ - "meta", - "hidden" + "orgs" ], - "summary": "Get the pricing for our subscriptions.", - "description": "This is the ultimate source of truth for the pricing of our subscriptions.", - "operationId": "get_pricing_subscriptions", + "summary": "Update the SAML identity provider.", + "description": "This endpoint requires authentication by an org admin.", + "operationId": "update_org_saml_idp", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SamlIdentityProviderCreate" + } + } + }, + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -16415,14 +16249,7 @@ "content": { "application/json": { "schema": { - "title": "Map_of_Array_of_ZooProductSubscription", - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZooProductSubscription" - } - } + "$ref": "#/components/schemas/SamlIdentityProvider" } } } @@ -16435,20 +16262,30 @@ } }, "x-billable": false - } - }, - "/projects/categories": { - "get": { + }, + "post": { "tags": [ - "projects" + "orgs" ], - "summary": "List the active categories available for project submissions.", - "operationId": "list_project_categories", + "summary": "Create a SAML identity provider.", + "description": "This endpoint requires authentication by an org admin.", + "operationId": "create_org_saml_idp", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SamlIdentityProviderCreate" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", "style": "simple", "schema": { "nullable": true, @@ -16456,6 +16293,7 @@ } }, "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", "style": "simple", "schema": { "nullable": true, @@ -16463,6 +16301,7 @@ } }, "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", "style": "simple", "schema": { "nullable": true, @@ -16470,20 +16309,15 @@ } }, "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", "style": "simple", "schema": { "nullable": true, "type": "string" } }, - "Cache-Control": { - "style": "simple", - "required": true, - "schema": { - "type": "string" - } - }, "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", "style": "simple", "schema": { "nullable": true, @@ -16491,6 +16325,7 @@ } }, "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", "style": "simple", "schema": { "nullable": true, @@ -16498,6 +16333,7 @@ } }, "Set-Cookie": { + "description": "Set-Cookie header.", "style": "simple", "schema": { "nullable": true, @@ -16505,6 +16341,7 @@ } }, "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", "style": "simple", "required": true, "schema": { @@ -16515,11 +16352,7 @@ "content": { "application/json": { "schema": { - "title": "Array_of_ProjectCategoryResponse", - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectCategoryResponse" - } + "$ref": "#/components/schemas/SamlIdentityProvider" } } } @@ -16533,16 +16366,102 @@ }, "x-billable": false }, - "options": { + "delete": { "tags": [ - "hidden" + "orgs" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_project_categories", + "summary": "Delete an SAML identity provider.", + "description": "This endpoint requires authentication by an org admin.", + "operationId": "delete_org_saml_idp", "responses": { "204": { - "description": "resource updated", + "description": "successful deletion", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_saml_idp", + "responses": { + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -16620,13 +16539,14 @@ "x-billable": false } }, - "/projects/public": { + "/org/service-accounts": { "get": { "tags": [ - "projects" + "service-accounts" ], - "summary": "List publicly visible community projects for the website/gallery.", - "operationId": "list_public_projects", + "summary": "List service accounts for your org.", + "description": "This endpoint requires authentication by an org member. It returns the service accounts for the organization.\n\nThe service accounts are returned in order of creation, with the most recently created service accounts first.", + "operationId": "list_service_accounts_for_org", "parameters": [ { "in": "query", @@ -16650,10 +16570,9 @@ }, { "in": "query", - "name": "category_id", - "description": "Return only projects assigned to this category. Omit to return all categories.", + "name": "sort_by", "schema": { - "$ref": "#/components/schemas/Uuid" + "$ref": "#/components/schemas/CreatedAtSortMode" } } ], @@ -16662,6 +16581,7 @@ "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", "style": "simple", "schema": { "nullable": true, @@ -16669,6 +16589,7 @@ } }, "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", "style": "simple", "schema": { "nullable": true, @@ -16676,6 +16597,7 @@ } }, "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", "style": "simple", "schema": { "nullable": true, @@ -16683,20 +16605,122 @@ } }, "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", "style": "simple", "schema": { "nullable": true, "type": "string" } }, - "Cache-Control": { + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", "style": "simple", "required": true, "schema": { "type": "string" } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountResultsPage" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, + "post": { + "tags": [ + "service-accounts" + ], + "summary": "Create a new service account for your org.", + "description": "This endpoint requires authentication by an org member. It creates a new service account for the organization.", + "operationId": "create_service_account_for_org", + "parameters": [ + { + "in": "query", + "name": "label", + "description": "An optional label for the service account.", + "schema": { + "nullable": true, + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "successful creation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } }, "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", "style": "simple", "schema": { "nullable": true, @@ -16704,6 +16728,7 @@ } }, "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", "style": "simple", "schema": { "nullable": true, @@ -16711,6 +16736,7 @@ } }, "Set-Cookie": { + "description": "Set-Cookie header.", "style": "simple", "schema": { "nullable": true, @@ -16718,6 +16744,7 @@ } }, "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", "style": "simple", "required": true, "schema": { @@ -16728,7 +16755,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublicProjectResponseResultsPage" + "$ref": "#/components/schemas/ServiceAccount" } } } @@ -16740,10 +16767,7 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false }, "options": { "tags": [ @@ -16751,7 +16775,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_public_projects", + "operationId": "options_create_service_account_for_org", "responses": { "204": { "description": "resource updated", @@ -16832,21 +16856,2452 @@ "x-billable": false } }, - "/projects/public/{id}": { + "/org/service-accounts/{token}": { + "get": { + "tags": [ + "service-accounts" + ], + "summary": "Get an service account for your org.", + "description": "This endpoint requires authentication by an org member. It returns details of the requested service account for the organization.", + "operationId": "get_service_account_for_org", + "parameters": [ + { + "in": "path", + "name": "token", + "description": "The service account.", + "required": true, + "schema": { + "$ref": "#/components/schemas/ServiceAccountUuid" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccount" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "delete": { + "tags": [ + "service-accounts" + ], + "summary": "Delete an service account for your org.", + "description": "This endpoint requires authentication by an org member. It deletes the requested service account for the organization.\n\nThis endpoint does not actually delete the service account from the database. It merely marks the token as invalid. We still want to keep the service account in the database for historical purposes.\n\nThe token path parameter can be either the full service account token (prefixed with `svc-`) or the token's unique ID (a UUID).", + "operationId": "delete_service_account_for_org", + "parameters": [ + { + "in": "path", + "name": "token", + "description": "The service account token (prefixed with `svc-`) or the token's unique ID (a UUID).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "successful deletion", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_service_account_for_org", + "parameters": [ + { + "in": "path", + "name": "token", + "description": "The service account.", + "required": true, + "schema": { + "$ref": "#/components/schemas/ServiceAccountUuid" + } + } + ], + "responses": { + "204": { + "description": "successful operation, no content", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/org/shortlinks": { + "get": { + "tags": [ + "orgs", + "shortlinks" + ], + "summary": "Get the shortlinks for an org.", + "description": "This endpoint requires authentication by an org admin. It gets the shortlinks for the authenticated user's org.", + "operationId": "get_org_shortlinks", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShortlinkResultsPage" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + } + }, + "/org/skills": { + "get": { + "tags": [ + "orgs" + ], + "summary": "List every skill that belongs to the caller's organization, ordered by name.", + "operationId": "list_org_skills", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrgSkillResponseResultsPage" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_org_skills", + "responses": { + "204": { + "description": "resource updated", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/ping": { + "get": { + "tags": [ + "meta" + ], + "summary": "Return pong.", + "operationId": "ping", + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pong" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/pricing/subscriptions": { + "get": { + "tags": [ + "meta", + "hidden" + ], + "summary": "Get the pricing for our subscriptions.", + "description": "This is the ultimate source of truth for the pricing of our subscriptions.", + "operationId": "get_pricing_subscriptions", + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "title": "Map_of_Array_of_ZooProductSubscription", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ZooProductSubscription" + } + } + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/projects/categories": { + "get": { + "tags": [ + "projects" + ], + "summary": "List the active categories available for project submissions.", + "operationId": "list_project_categories", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Cache-Control": { + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + }, + "Content-Location": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectCategoryResponseResultsPage" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_project_categories", + "responses": { + "204": { + "description": "resource updated", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/projects/public": { + "get": { + "tags": [ + "projects" + ], + "summary": "List publicly visible community projects for the website/gallery.", + "operationId": "list_public_projects", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "category_id", + "description": "Return only projects assigned to this category. Omit to return all categories.", + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Cache-Control": { + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + }, + "Content-Location": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicProjectResponseResultsPage" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_public_projects", + "responses": { + "204": { + "description": "resource updated", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/projects/public/{id}": { + "get": { + "tags": [ + "projects" + ], + "summary": "Get one publicly visible community project.", + "operationId": "get_public_project", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Cache-Control": { + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + }, + "Content-Location": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicProjectResponse" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_public_project", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "204": { + "description": "successful operation, no content", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/projects/public/{id}/download": { + "get": { + "tags": [ + "projects" + ], + "summary": "Download all or selected files from a published public project.", + "operationId": "download_public_project", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "query", + "name": "format", + "description": "Archive format to return. Defaults to `tar`.", + "schema": { + "$ref": "#/components/schemas/ProjectArchiveFormat" + } + }, + { + "in": "query", + "name": "file_ids", + "description": "Optional comma-separated file IDs from this download's version. Omit to download every file. An empty or malformed list returns HTTP 400 with `error_code: InvalidProjectFileIds`. Any ID outside this version returns HTTP 400 with `error_code: InvalidProjectFileSelection` and a `missing_file_ids` array listing the requested IDs absent from this version. The entire selection fails: requesting ten IDs with one missing returns HTTP 400 without an archive. Missing projects or versions still return HTTP 404. Repeated IDs are included once. Selecting one file still returns the requested archive format.", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "minItems": 1 + }, + "explode": false + } + ], + "responses": { + "default": { + "description": "", + "content": { + "*/*": { + "schema": {} + } + } + }, + "400": { + "description": "Invalid download parameters. InvalidProjectFileSelection includes missing_file_ids.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectDownloadErrorResponse" + } + } + } + } + }, + "x-billable": false + } + }, + "/projects/public/{id}/thumbnail": { + "get": { + "tags": [ + "projects" + ], + "summary": "Fetch the public thumbnail for a published project.", + "operationId": "get_public_project_thumbnail", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "default": { + "description": "", + "content": { + "*/*": { + "schema": {} + } + } + } + }, + "x-billable": false + } + }, + "/projects/public/{id}/vote": { + "post": { + "tags": [ + "projects" + ], + "summary": "Add the authenticated user's upvote to a published community project.", + "operationId": "create_public_project_vote", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicProjectVoteResponse" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "delete": { + "tags": [ + "projects" + ], + "summary": "Remove the authenticated user's upvote from a published community project.", + "operationId": "delete_public_project_vote", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicProjectVoteResponse" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_public_project_vote", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], + "responses": { + "204": { + "description": "successful operation, no content", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/projects/shared/{key}/download": { + "get": { + "tags": [ + "hidden", + "projects" + ], + "summary": "Download all or selected files using a share link.", + "description": "File IDs must belong to the version pinned by this link. Manifest downloads retain the same public-data sanitization when selected individually.", + "operationId": "download_shared_project", + "parameters": [ + { + "in": "path", + "name": "key", + "description": "Share-link key.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "format", + "description": "Archive format to return. Defaults to `tar`.", + "schema": { + "$ref": "#/components/schemas/ProjectArchiveFormat" + } + }, + { + "in": "query", + "name": "file_ids", + "description": "Optional comma-separated file IDs from this download's version. Omit to download every file. An empty or malformed list returns HTTP 400 with `error_code: InvalidProjectFileIds`. Any ID outside this version returns HTTP 400 with `error_code: InvalidProjectFileSelection` and a `missing_file_ids` array listing the requested IDs absent from this version. The entire selection fails: requesting ten IDs with one missing returns HTTP 400 without an archive. Missing projects or versions still return HTTP 404. Repeated IDs are included once. Selecting one file still returns the requested archive format.", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "minItems": 1 + }, + "explode": false + } + ], + "responses": { + "default": { + "description": "", + "content": { + "*/*": { + "schema": {} + } + } + }, + "400": { + "description": "Invalid download parameters. InvalidProjectFileSelection includes missing_file_ids.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectDownloadErrorResponse" + } + } + } + } + }, + "x-billable": false + } + }, + "/unit/conversion/angle/{input_unit}/{output_unit}": { + "get": { + "tags": [ + "unit" + ], + "summary": "Convert angle units.", + "description": "Convert an angle unit value to another angle unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_angle_unit_conversion", + "parameters": [ + { + "in": "path", + "name": "input_unit", + "description": "The source format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitAngle" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitAngle" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitAngleConversion" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/unit/conversion/area/{input_unit}/{output_unit}": { + "get": { + "tags": [ + "unit" + ], + "summary": "Convert area units.", + "description": "Convert an area unit value to another area unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_area_unit_conversion", + "parameters": [ + { + "in": "path", + "name": "input_unit", + "description": "The source format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitArea" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitArea" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitAreaConversion" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/unit/conversion/current/{input_unit}/{output_unit}": { + "get": { + "tags": [ + "unit" + ], + "summary": "Convert current units.", + "description": "Convert a current unit value to another current unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_current_unit_conversion", + "parameters": [ + { + "in": "path", + "name": "input_unit", + "description": "The source format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitCurrent" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitCurrent" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitCurrentConversion" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/unit/conversion/energy/{input_unit}/{output_unit}": { + "get": { + "tags": [ + "unit" + ], + "summary": "Convert energy units.", + "description": "Convert a energy unit value to another energy unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_energy_unit_conversion", + "parameters": [ + { + "in": "path", + "name": "input_unit", + "description": "The source format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitEnergy" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitEnergy" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitEnergyConversion" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + } + }, + "/unit/conversion/force/{input_unit}/{output_unit}": { "get": { "tags": [ - "projects" + "unit" ], - "summary": "Get one publicly visible community project.", - "operationId": "get_public_project", + "summary": "Convert force units.", + "description": "Convert a force unit value to another force unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_force_unit_conversion", "parameters": [ { "in": "path", - "name": "id", - "description": "The identifier.", + "name": "input_unit", + "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "$ref": "#/components/schemas/UnitForce" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitForce" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" } } ], @@ -16855,6 +19310,7 @@ "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", "style": "simple", "schema": { "nullable": true, @@ -16862,6 +19318,7 @@ } }, "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", "style": "simple", "schema": { "nullable": true, @@ -16869,6 +19326,7 @@ } }, "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", "style": "simple", "schema": { "nullable": true, @@ -16876,20 +19334,15 @@ } }, "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", "style": "simple", "schema": { "nullable": true, "type": "string" } }, - "Cache-Control": { - "style": "simple", - "required": true, - "schema": { - "type": "string" - } - }, "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", "style": "simple", "schema": { "nullable": true, @@ -16897,6 +19350,7 @@ } }, "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", "style": "simple", "schema": { "nullable": true, @@ -16904,6 +19358,7 @@ } }, "Set-Cookie": { + "description": "Set-Cookie header.", "style": "simple", "schema": { "nullable": true, @@ -16911,6 +19366,7 @@ } }, "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", "style": "simple", "required": true, "schema": { @@ -16921,7 +19377,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublicProjectResponse" + "$ref": "#/components/schemas/UnitForceConversion" } } } @@ -16934,28 +19390,49 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/unit/conversion/frequency/{input_unit}/{output_unit}": { + "get": { "tags": [ - "hidden" + "unit" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_public_project", + "summary": "Convert frequency units.", + "description": "Convert a frequency unit value to another frequency unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_frequency_unit_conversion", "parameters": [ { "in": "path", - "name": "id", - "description": "The identifier.", + "name": "input_unit", + "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "$ref": "#/components/schemas/UnitFrequency" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitFrequency" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" } } ], "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -17021,6 +19498,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitFrequencyConversion" + } + } } }, "4XX": { @@ -17033,91 +19517,41 @@ "x-billable": false } }, - "/projects/public/{id}/download": { + "/unit/conversion/length/{input_unit}/{output_unit}": { "get": { "tags": [ - "projects" + "unit" ], - "summary": "Download a published public project as a tar archive.", - "operationId": "download_public_project", + "summary": "Convert length units.", + "description": "Convert a length unit value to another length unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_length_unit_conversion", "parameters": [ { "in": "path", - "name": "id", - "description": "The identifier.", + "name": "input_unit", + "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "$ref": "#/components/schemas/UnitLength" } }, - { - "in": "query", - "name": "format", - "description": "Archive format to return. Defaults to `tar`.", - "schema": { - "$ref": "#/components/schemas/ProjectArchiveFormat" - } - } - ], - "responses": { - "default": { - "description": "", - "content": { - "*/*": { - "schema": {} - } - } - } - }, - "x-billable": false - } - }, - "/projects/public/{id}/thumbnail": { - "get": { - "tags": [ - "projects" - ], - "summary": "Fetch the public thumbnail for a published project.", - "operationId": "get_public_project_thumbnail", - "parameters": [ { "in": "path", - "name": "id", - "description": "The identifier.", + "name": "output_unit", + "description": "The output format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" - } - } - ], - "responses": { - "default": { - "description": "", - "content": { - "*/*": { - "schema": {} - } + "$ref": "#/components/schemas/UnitLength" } - } - }, - "x-billable": false - } - }, - "/projects/public/{id}/vote": { - "post": { - "tags": [ - "projects" - ], - "summary": "Add the authenticated user's upvote to a published community project.", - "operationId": "create_public_project_vote", - "parameters": [ + }, { - "in": "path", - "name": "id", - "description": "The identifier.", + "in": "query", + "name": "value", + "description": "The initial value.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "type": "number", + "format": "double" } } ], @@ -17193,7 +19627,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublicProjectVoteResponse" + "$ref": "#/components/schemas/UnitLengthConversion" } } } @@ -17206,21 +19640,43 @@ } }, "x-billable": false - }, - "delete": { + } + }, + "/unit/conversion/mass/{input_unit}/{output_unit}": { + "get": { "tags": [ - "projects" + "unit" ], - "summary": "Remove the authenticated user's upvote from a published community project.", - "operationId": "delete_public_project_vote", + "summary": "Convert mass units.", + "description": "Convert a mass unit value to another mass unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_mass_unit_conversion", "parameters": [ { "in": "path", - "name": "id", - "description": "The identifier.", + "name": "input_unit", + "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "$ref": "#/components/schemas/UnitMass" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitMass" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" } } ], @@ -17296,7 +19752,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublicProjectVoteResponse" + "$ref": "#/components/schemas/UnitMassConversion" } } } @@ -17309,28 +19765,49 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/unit/conversion/power/{input_unit}/{output_unit}": { + "get": { "tags": [ - "hidden" + "unit" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_public_project_vote", + "summary": "Convert power units.", + "description": "Convert a power unit value to another power unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_power_unit_conversion", "parameters": [ { "in": "path", - "name": "id", - "description": "The identifier.", + "name": "input_unit", + "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/Uuid" + "$ref": "#/components/schemas/UnitPower" + } + }, + { + "in": "path", + "name": "output_unit", + "description": "The output format of the unit.", + "required": true, + "schema": { + "$ref": "#/components/schemas/UnitPower" + } + }, + { + "in": "query", + "name": "value", + "description": "The initial value.", + "required": true, + "schema": { + "type": "number", + "format": "double" } } ], "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -17396,6 +19873,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitPowerConversion" + } + } } }, "4XX": { @@ -17408,54 +19892,14 @@ "x-billable": false } }, - "/projects/shared/{key}/download": { - "get": { - "tags": [ - "hidden", - "projects" - ], - "summary": "Download a project using a share link.", - "operationId": "download_shared_project", - "parameters": [ - { - "in": "path", - "name": "key", - "description": "Share-link key.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "format", - "description": "Archive format to return. Defaults to `tar`.", - "schema": { - "$ref": "#/components/schemas/ProjectArchiveFormat" - } - } - ], - "responses": { - "default": { - "description": "", - "content": { - "*/*": { - "schema": {} - } - } - } - }, - "x-billable": false - } - }, - "/unit/conversion/angle/{input_unit}/{output_unit}": { + "/unit/conversion/pressure/{input_unit}/{output_unit}": { "get": { "tags": [ "unit" ], - "summary": "Convert angle units.", - "description": "Convert an angle unit value to another angle unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_angle_unit_conversion", + "summary": "Convert pressure units.", + "description": "Convert a pressure unit value to another pressure unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_pressure_unit_conversion", "parameters": [ { "in": "path", @@ -17463,7 +19907,7 @@ "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitAngle" + "$ref": "#/components/schemas/UnitPressure" } }, { @@ -17472,7 +19916,7 @@ "description": "The output format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitAngle" + "$ref": "#/components/schemas/UnitPressure" } }, { @@ -17558,7 +20002,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitAngleConversion" + "$ref": "#/components/schemas/UnitPressureConversion" } } } @@ -17573,14 +20017,14 @@ "x-billable": false } }, - "/unit/conversion/area/{input_unit}/{output_unit}": { + "/unit/conversion/temperature/{input_unit}/{output_unit}": { "get": { "tags": [ "unit" ], - "summary": "Convert area units.", - "description": "Convert an area unit value to another area unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_area_unit_conversion", + "summary": "Convert temperature units.", + "description": "Convert a temperature unit value to another temperature unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_temperature_unit_conversion", "parameters": [ { "in": "path", @@ -17588,7 +20032,7 @@ "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitArea" + "$ref": "#/components/schemas/UnitTemperature" } }, { @@ -17597,7 +20041,7 @@ "description": "The output format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitArea" + "$ref": "#/components/schemas/UnitTemperature" } }, { @@ -17683,7 +20127,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitAreaConversion" + "$ref": "#/components/schemas/UnitTemperatureConversion" } } } @@ -17698,14 +20142,14 @@ "x-billable": false } }, - "/unit/conversion/current/{input_unit}/{output_unit}": { + "/unit/conversion/torque/{input_unit}/{output_unit}": { "get": { "tags": [ "unit" ], - "summary": "Convert current units.", - "description": "Convert a current unit value to another current unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_current_unit_conversion", + "summary": "Convert torque units.", + "description": "Convert a torque unit value to another torque unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_torque_unit_conversion", "parameters": [ { "in": "path", @@ -17713,7 +20157,7 @@ "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitCurrent" + "$ref": "#/components/schemas/UnitTorque" } }, { @@ -17722,7 +20166,7 @@ "description": "The output format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitCurrent" + "$ref": "#/components/schemas/UnitTorque" } }, { @@ -17808,7 +20252,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitCurrentConversion" + "$ref": "#/components/schemas/UnitTorqueConversion" } } } @@ -17823,14 +20267,14 @@ "x-billable": false } }, - "/unit/conversion/energy/{input_unit}/{output_unit}": { + "/unit/conversion/volume/{input_unit}/{output_unit}": { "get": { "tags": [ "unit" ], - "summary": "Convert energy units.", - "description": "Convert a energy unit value to another energy unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_energy_unit_conversion", + "summary": "Convert volume units.", + "description": "Convert a volume unit value to another volume unit value. This is a nice endpoint to use for helper functions.", + "operationId": "get_volume_unit_conversion", "parameters": [ { "in": "path", @@ -17838,7 +20282,7 @@ "description": "The source format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitEnergy" + "$ref": "#/components/schemas/UnitVolume" } }, { @@ -17847,7 +20291,7 @@ "description": "The output format of the unit.", "required": true, "schema": { - "$ref": "#/components/schemas/UnitEnergy" + "$ref": "#/components/schemas/UnitVolume" } }, { @@ -17933,7 +20377,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitEnergyConversion" + "$ref": "#/components/schemas/UnitVolumeConversion" } } } @@ -17948,44 +20392,14 @@ "x-billable": false } }, - "/unit/conversion/force/{input_unit}/{output_unit}": { + "/user": { "get": { "tags": [ - "unit" - ], - "summary": "Convert force units.", - "description": "Convert a force unit value to another force unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_force_unit_conversion", - "parameters": [ - { - "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitForce" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitForce" - } - }, - { - "in": "query", - "name": "value", - "description": "The initial value.", - "required": true, - "schema": { - "type": "number", - "format": "double" - } - } + "users" ], + "summary": "Get your user.", + "description": "Get the user information for the authenticated user.\n\nAlternatively, you can also use the `/users/me` endpoint.", + "operationId": "get_user_self", "responses": { "200": { "description": "successful operation", @@ -18058,7 +20472,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitForceConversion" + "$ref": "#/components/schemas/UserResponse" } } } @@ -18071,46 +20485,24 @@ } }, "x-billable": false - } - }, - "/unit/conversion/frequency/{input_unit}/{output_unit}": { - "get": { + }, + "put": { "tags": [ - "unit" + "users" ], - "summary": "Convert frequency units.", - "description": "Convert a frequency unit value to another frequency unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_frequency_unit_conversion", - "parameters": [ - { - "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitFrequency" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitFrequency" + "summary": "Update your user.", + "description": "This endpoint requires authentication by any Zoo user. It updates information about the authenticated user.", + "operationId": "update_user_self", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + } } }, - { - "in": "query", - "name": "value", - "description": "The initial value.", - "required": true, - "schema": { - "type": "number", - "format": "double" - } - } - ], + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -18183,7 +20575,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitFrequencyConversion" + "$ref": "#/components/schemas/UserResponse" } } } @@ -18196,49 +20588,17 @@ } }, "x-billable": false - } - }, - "/unit/conversion/length/{input_unit}/{output_unit}": { - "get": { + }, + "delete": { "tags": [ - "unit" - ], - "summary": "Convert length units.", - "description": "Convert a length unit value to another length unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_length_unit_conversion", - "parameters": [ - { - "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitLength" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitLength" - } - }, - { - "in": "query", - "name": "value", - "description": "The initial value.", - "required": true, - "schema": { - "type": "number", - "format": "double" - } - } + "users" ], + "summary": "Delete your user.", + "description": "This endpoint requires authentication by any Zoo user. It deletes the authenticated user from Zoo's database.\n\nThis call will only succeed if all invoices associated with the user have been paid in full and there is no outstanding balance. Personal Factory jobs must be completed or canceled before deleting your account. In-progress jobs owned by an organization do not prevent account deletion.", + "operationId": "delete_user_self", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -18304,13 +20664,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnitLengthConversion" - } - } } }, "4XX": { @@ -18321,49 +20674,17 @@ } }, "x-billable": false - } - }, - "/unit/conversion/mass/{input_unit}/{output_unit}": { - "get": { + }, + "options": { "tags": [ - "unit" - ], - "summary": "Convert mass units.", - "description": "Convert a mass unit value to another mass unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_mass_unit_conversion", - "parameters": [ - { - "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitMass" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitMass" - } - }, - { - "in": "query", - "name": "value", - "description": "The initial value.", - "required": true, - "schema": { - "type": "number", - "format": "double" - } - } + "hidden" ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_user_self", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -18429,13 +20750,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnitMassConversion" - } - } } }, "4XX": { @@ -18448,41 +20762,33 @@ "x-billable": false } }, - "/unit/conversion/power/{input_unit}/{output_unit}": { + "/user/addresses": { "get": { "tags": [ - "unit" + "addresses" ], - "summary": "Convert power units.", - "description": "Convert a power unit value to another power unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_power_unit_conversion", + "summary": "List your saved addresses, including the current billing address.", + "description": "One-off and archived cards are omitted. Billing cards may contain incomplete historical details and use the payment endpoints for edits. Follow next_page with page_token to read the next page. Results are ordered by stable card ID.", + "operationId": "list_user_addresses", "parameters": [ { - "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitPower" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", "schema": { - "$ref": "#/components/schemas/UnitPower" + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 } }, { "in": "query", - "name": "value", - "description": "The initial value.", - "required": true, + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", "schema": { - "type": "number", - "format": "double" + "nullable": true, + "type": "string" } } ], @@ -18558,7 +20864,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitPowerConversion" + "$ref": "#/components/schemas/AddressResponseResultsPage" } } } @@ -18570,50 +20876,31 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false - } - }, - "/unit/conversion/pressure/{input_unit}/{output_unit}": { - "get": { + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, + "post": { "tags": [ - "unit" + "addresses" ], - "summary": "Convert pressure units.", - "description": "Convert a pressure unit value to another pressure unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_pressure_unit_conversion", - "parameters": [ - { - "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitPressure" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitPressure" + "summary": "Create a personal delivery address.", + "description": "Set is_saved=false for a one-off destination. It remains owned and erasable while staying out of the picker. Creating a delivery address never changes billing.", + "operationId": "create_user_address", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAddressRequest" + } } }, - { - "in": "query", - "name": "value", - "description": "The initial value.", - "required": true, - "schema": { - "type": "number", - "format": "double" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -18683,7 +20970,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitPressureConversion" + "$ref": "#/components/schemas/AddressResponse" } } } @@ -18696,49 +20983,17 @@ } }, "x-billable": false - } - }, - "/unit/conversion/temperature/{input_unit}/{output_unit}": { - "get": { + }, + "options": { "tags": [ - "unit" - ], - "summary": "Convert temperature units.", - "description": "Convert a temperature unit value to another temperature unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_temperature_unit_conversion", - "parameters": [ - { - "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitTemperature" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitTemperature" - } - }, - { - "in": "query", - "name": "value", - "description": "The initial value.", - "required": true, - "schema": { - "type": "number", - "format": "double" - } - } + "hidden" ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_user_addresses", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -18804,13 +21059,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnitTemperatureConversion" - } - } } }, "4XX": { @@ -18823,41 +21071,21 @@ "x-billable": false } }, - "/unit/conversion/torque/{input_unit}/{output_unit}": { + "/user/addresses/{id}": { "get": { "tags": [ - "unit" + "addresses" ], - "summary": "Convert torque units.", - "description": "Convert a torque unit value to another torque unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_torque_unit_conversion", + "summary": "Get a personal address and its current immutable revision.", + "operationId": "get_user_address", "parameters": [ { "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitTorque" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitTorque" - } - }, - { - "in": "query", - "name": "value", - "description": "The initial value.", + "name": "id", + "description": "The identifier.", "required": true, "schema": { - "type": "number", - "format": "double" + "$ref": "#/components/schemas/Uuid" } } ], @@ -18933,7 +21161,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitTorqueConversion" + "$ref": "#/components/schemas/AddressResponse" } } } @@ -18946,46 +21174,35 @@ } }, "x-billable": false - } - }, - "/unit/conversion/volume/{input_unit}/{output_unit}": { - "get": { + }, + "put": { "tags": [ - "unit" + "addresses" ], - "summary": "Convert volume units.", - "description": "Convert a volume unit value to another volume unit value. This is a nice endpoint to use for helper functions.", - "operationId": "get_volume_unit_conversion", + "summary": "Replace a personal delivery address and its shipping-default selection.", + "description": "expected_revision must match the current revision_id. Edits create immutable revisions, preserving any revision already selected by an order. Billing cards must be updated through the payment endpoints.", + "operationId": "update_user_address", "parameters": [ { "in": "path", - "name": "input_unit", - "description": "The source format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitVolume" - } - }, - { - "in": "path", - "name": "output_unit", - "description": "The output format of the unit.", - "required": true, - "schema": { - "$ref": "#/components/schemas/UnitVolume" - } - }, - { - "in": "query", - "name": "value", - "description": "The initial value.", + "name": "id", + "description": "The identifier.", "required": true, "schema": { - "type": "number", - "format": "double" + "$ref": "#/components/schemas/Uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAddressRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -19058,7 +21275,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UnitVolumeConversion" + "$ref": "#/components/schemas/AddressResponse" } } } @@ -19071,19 +21288,37 @@ } }, "x-billable": false - } - }, - "/user": { - "get": { + }, + "delete": { "tags": [ - "users" + "addresses" + ], + "summary": "Remove a personal address from future selection.", + "description": "Requires its current expected_revision. Revisions pinned by orders remain available until account erasure. An active billing address cannot be removed.", + "operationId": "delete_user_address", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "query", + "name": "expected_revision", + "description": "revision_id returned when the card was loaded.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } ], - "summary": "Get your user.", - "description": "Get the user information for the authenticated user.\n\nAlternatively, you can also use the `/users/me` endpoint.", - "operationId": "get_user_self", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -19149,13 +21384,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserResponse" - } - } } }, "4XX": { @@ -19167,26 +21395,27 @@ }, "x-billable": false }, - "put": { + "options": { "tags": [ - "users" + "hidden" ], - "summary": "Update your user.", - "description": "This endpoint requires authentication by any Zoo user. It updates information about the authenticated user.", - "operationId": "update_user_self", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateUser" - } + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_user_address", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" } - }, - "required": true - }, + } + ], "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -19252,13 +21481,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserResponse" - } - } } }, "4XX": { @@ -19269,17 +21491,48 @@ } }, "x-billable": false - }, - "delete": { + } + }, + "/user/api-calls": { + "get": { "tags": [ - "users" + "api-calls" + ], + "summary": "List API calls for your user.", + "description": "This endpoint requires authentication by any Zoo user. It returns the API calls for the authenticated user.\n\nThe API calls are returned in order of creation, with the most recently created API calls first.", + "operationId": "user_list_api_calls", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" + } + } ], - "summary": "Delete your user.", - "description": "This endpoint requires authentication by any Zoo user. It deletes the authenticated user from Zoo's database.\n\nThis call will only succeed if all invoices associated with the user have been paid in full and there is no outstanding balance. Personal Factory jobs must be completed or canceled before deleting your account. In-progress jobs owned by an organization do not prevent account deletion.", - "operationId": "delete_user_self", "responses": { - "204": { - "description": "successful deletion", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -19345,6 +21598,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCallWithPriceResultsPage" + } + } } }, "4XX": { @@ -19354,18 +21614,35 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false - }, - "options": { + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + } + }, + "/user/api-calls/{id}": { + "get": { "tags": [ - "hidden" + "api-calls" + ], + "summary": "Get an API call for a user.", + "description": "This endpoint requires authentication by any Zoo user. It returns details of the requested API call for the user.", + "operationId": "get_api_call_for_user", + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The ID of the API call.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_user_self", "responses": { - "204": { - "description": "resource updated", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -19431,6 +21708,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiCallWithPrice" + } + } } }, "4XX": { @@ -19443,14 +21727,14 @@ "x-billable": false } }, - "/user/api-calls": { + "/user/api-tokens": { "get": { "tags": [ - "api-calls" + "api-tokens" ], - "summary": "List API calls for your user.", - "description": "This endpoint requires authentication by any Zoo user. It returns the API calls for the authenticated user.\n\nThe API calls are returned in order of creation, with the most recently created API calls first.", - "operationId": "user_list_api_calls", + "summary": "List API tokens for your user.", + "description": "This endpoint requires authentication by any Zoo user. It returns the API tokens for the authenticated user.\n\nThe API tokens are returned in order of creation, with the most recently created API tokens first.", + "operationId": "list_api_tokens_for_user", "parameters": [ { "in": "query", @@ -19552,7 +21836,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiCallWithPriceResultsPage" + "$ref": "#/components/schemas/ApiTokenResultsPage" } } } @@ -19568,31 +21852,28 @@ "x-dropshot-pagination": { "required": [] } - } - }, - "/user/api-calls/{id}": { - "get": { + }, + "post": { "tags": [ - "api-calls" + "api-tokens" ], - "summary": "Get an API call for a user.", - "description": "This endpoint requires authentication by any Zoo user. It returns details of the requested API call for the user.", - "operationId": "get_api_call_for_user", + "summary": "Create a new API token for your user.", + "description": "This endpoint requires authentication by any Zoo user. It creates a new API token for the authenticated user.", + "operationId": "create_api_token_for_user", "parameters": [ { - "in": "path", - "name": "id", - "description": "The ID of the API call.", - "required": true, + "in": "query", + "name": "label", + "description": "An optional label for the API token.", "schema": { - "type": "string", - "format": "uuid" + "nullable": true, + "type": "string" } } ], "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -19662,7 +21943,93 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiCallWithPrice" + "$ref": "#/components/schemas/ApiTokenWithFullToken" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false + }, + "options": { + "tags": [ + "hidden" + ], + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_create_api_token_for_user", + "responses": { + "204": { + "description": "resource updated", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" } } } @@ -19677,40 +22044,22 @@ "x-billable": false } }, - "/user/api-tokens": { + "/user/api-tokens/{token}": { "get": { "tags": [ "api-tokens" ], - "summary": "List API tokens for your user.", - "description": "This endpoint requires authentication by any Zoo user. It returns the API tokens for the authenticated user.\n\nThe API tokens are returned in order of creation, with the most recently created API tokens first.", - "operationId": "list_api_tokens_for_user", + "summary": "Get an API token for your user.", + "description": "This endpoint requires authentication by any Zoo user. It returns details of the requested API token for the user.", + "operationId": "get_api_token_for_user", "parameters": [ { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", - "schema": { - "nullable": true, - "type": "string" - } - }, - { - "in": "query", - "name": "sort_by", + "in": "path", + "name": "token", + "description": "The API token.", + "required": true, "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" + "$ref": "#/components/schemas/ApiTokenUuid" } } ], @@ -19786,7 +22135,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiTokenResultsPage" + "$ref": "#/components/schemas/ApiToken" } } } @@ -19798,32 +22147,29 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false }, - "post": { + "delete": { "tags": [ "api-tokens" ], - "summary": "Create a new API token for your user.", - "description": "This endpoint requires authentication by any Zoo user. It creates a new API token for the authenticated user.", - "operationId": "create_api_token_for_user", + "summary": "Delete an API token for your user.", + "description": "This endpoint requires authentication by any Zoo user. It deletes the requested API token for the user.\n\nThis endpoint does not actually delete the API token from the database. It merely marks the token as invalid. We still want to keep the token in the database for historical purposes.\n\nThe token path parameter can be either the full API token (prefixed with `api-`) or the token's unique ID (a UUID).", + "operationId": "delete_api_token_for_user", "parameters": [ { - "in": "query", - "name": "label", - "description": "An optional label for the API token.", + "in": "path", + "name": "token", + "description": "The API token (prefixed with `api-`) or the token's unique ID (a UUID).", + "required": true, "schema": { - "nullable": true, "type": "string" } } ], "responses": { - "201": { - "description": "successful creation", + "204": { + "description": "successful deletion", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -19889,13 +22235,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiTokenWithFullToken" - } - } } }, "4XX": { @@ -19913,10 +22252,21 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_create_api_token_for_user", + "operationId": "options_api_token_for_user", + "parameters": [ + { + "in": "path", + "name": "token", + "description": "The API token.", + "required": true, + "schema": { + "$ref": "#/components/schemas/ApiTokenUuid" + } + } + ], "responses": { "204": { - "description": "resource updated", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -19994,25 +22344,116 @@ "x-billable": false } }, - "/user/api-tokens/{token}": { + "/user/billing/usage-collection-threshold": { "get": { "tags": [ - "api-tokens" + "payments" ], - "summary": "Get an API token for your user.", - "description": "This endpoint requires authentication by any Zoo user. It returns details of the requested API token for the user.", - "operationId": "get_api_token_for_user", - "parameters": [ - { - "in": "path", - "name": "token", - "description": "The API token.", - "required": true, - "schema": { - "$ref": "#/components/schemas/ApiTokenUuid" + "summary": "Get your personal aggregate-usage collection threshold.", + "description": "The effective threshold is the amount of accrued, unfunded usage that causes an early invoice before the normal billing-period close.", + "operationId": "get_user_usage_collection_threshold", + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" + } + } } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" } + }, + "x-billable": false + }, + "put": { + "tags": [ + "payments" ], + "summary": "Set your personal aggregate-usage collection threshold.", + "operationId": "set_user_usage_collection_threshold", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdSet" + } + } + }, + "required": true + }, "responses": { "200": { "description": "successful operation", @@ -20085,7 +22526,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApiToken" + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" } } } @@ -20101,25 +22542,25 @@ }, "delete": { "tags": [ - "api-tokens" + "payments" ], - "summary": "Delete an API token for your user.", - "description": "This endpoint requires authentication by any Zoo user. It deletes the requested API token for the user.\n\nThis endpoint does not actually delete the API token from the database. It merely marks the token as invalid. We still want to keep the token in the database for historical purposes.\n\nThe token path parameter can be either the full API token (prefixed with `api-`) or the token's unique ID (a UUID).", - "operationId": "delete_api_token_for_user", + "summary": "Restore the default for your personal aggregate-usage collection threshold.", + "operationId": "reset_user_usage_collection_threshold", "parameters": [ { - "in": "path", - "name": "token", - "description": "The API token (prefixed with `api-`) or the token's unique ID (a UUID).", + "in": "query", + "name": "expected_version", + "description": "Version returned by the read that this mutation is based on.", "required": true, "schema": { - "type": "string" + "type": "integer", + "format": "int64" } } ], "responses": { - "204": { - "description": "successful deletion", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -20185,6 +22626,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" + } + } } }, "4XX": { @@ -20202,21 +22650,10 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_api_token_for_user", - "parameters": [ - { - "in": "path", - "name": "token", - "description": "The API token.", - "required": true, - "schema": { - "$ref": "#/components/schemas/ApiTokenUuid" - } - } - ], + "operationId": "options_user_usage_collection_threshold", "responses": { "204": { - "description": "successful operation, no content", + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -20294,14 +22731,13 @@ "x-billable": false } }, - "/user/billing/usage-collection-threshold": { + "/user/cad-user-info": { "get": { "tags": [ - "payments" + "users" ], - "summary": "Get your personal aggregate-usage collection threshold.", - "description": "The effective threshold is the amount of accrued, unfunded usage that causes an early invoice before the normal billing-period close.", - "operationId": "get_user_usage_collection_threshold", + "summary": "Gets authenticated CAD user info form data for the current user.", + "operationId": "get_user_cad_user_info_form", "responses": { "200": { "description": "successful operation", @@ -20374,7 +22810,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" + "$ref": "#/components/schemas/WebsiteCadUserInfoForm" } } } @@ -20388,25 +22824,16 @@ }, "x-billable": false }, - "put": { + "options": { "tags": [ - "payments" + "hidden" ], - "summary": "Set your personal aggregate-usage collection threshold.", - "operationId": "set_user_usage_collection_threshold", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdSet" - } - } - }, - "required": true - }, + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_get_user_cad_user_info_form", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -20472,13 +22899,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" - } - } } }, "4XX": { @@ -20489,28 +22909,29 @@ } }, "x-billable": false - }, - "delete": { + } + }, + "/user/client-errors": { + "post": { "tags": [ - "payments" + "users" ], - "summary": "Restore the default for your personal aggregate-usage collection threshold.", - "operationId": "reset_user_usage_collection_threshold", - "parameters": [ - { - "in": "query", - "name": "expected_version", - "description": "Version returned by the read that this mutation is based on.", - "required": true, - "schema": { - "type": "integer", - "format": "int64" + "summary": "Report a client-originated error.", + "description": "This endpoint requires authentication by any Zoo user. It accepts a structured client error payload and writes it to the server logs for triage.", + "operationId": "report_user_client_error", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientErrorReport" + } } - } - ], + }, + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "202": { + "description": "successfully enqueued operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -20580,7 +23001,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AggregateUsageCollectionThresholdView" + "$ref": "#/components/schemas/ClientErrorReportAccepted" } } } @@ -20600,7 +23021,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_user_usage_collection_threshold", + "operationId": "options_user_client_error", "responses": { "204": { "description": "resource updated", @@ -20681,13 +23102,13 @@ "x-billable": false } }, - "/user/cad-user-info": { + "/user/email-marketing-consent": { "get": { "tags": [ "users" ], - "summary": "Gets authenticated CAD user info form data for the current user.", - "operationId": "get_user_cad_user_info_form", + "summary": "Get email marketing consent state for the authenticated user.", + "operationId": "user_email_marketing_consent_get", "responses": { "200": { "description": "successful operation", @@ -20760,7 +23181,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WebsiteCadUserInfoForm" + "$ref": "#/components/schemas/EmailMarketingConsentState" } } } @@ -20780,7 +23201,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_get_user_cad_user_info_form", + "operationId": "options_user_email_marketing_consent", "responses": { "204": { "description": "resource updated", @@ -20861,27 +23282,16 @@ "x-billable": false } }, - "/user/client-errors": { + "/user/email-marketing-consent/decline": { "post": { "tags": [ "users" ], - "summary": "Report a client-originated error.", - "description": "This endpoint requires authentication by any Zoo user. It accepts a structured client error payload and writes it to the server logs for triage.", - "operationId": "report_user_client_error", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClientErrorReport" - } - } - }, - "required": true - }, + "summary": "Record explicit decline for email marketing consent.", + "operationId": "user_email_marketing_consent_decline_post", "responses": { - "202": { - "description": "successfully enqueued operation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -20947,13 +23357,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClientErrorReportAccepted" - } - } } }, "4XX": { @@ -20971,7 +23374,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_user_client_error", + "operationId": "options_user_email_marketing_consent_decline", "responses": { "204": { "description": "resource updated", @@ -21052,16 +23455,16 @@ "x-billable": false } }, - "/user/email-marketing-consent": { - "get": { + "/user/email-marketing-consent/request": { + "post": { "tags": [ "users" ], - "summary": "Get email marketing consent state for the authenticated user.", - "operationId": "user_email_marketing_consent_get", + "summary": "Request email marketing opt-in and send a confirmation email.", + "operationId": "user_email_marketing_consent_request_post", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -21127,13 +23530,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmailMarketingConsentState" - } - } } }, "4XX": { @@ -21151,7 +23547,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_user_email_marketing_consent", + "operationId": "options_user_email_marketing_consent_request", "responses": { "204": { "description": "resource updated", @@ -21232,13 +23628,13 @@ "x-billable": false } }, - "/user/email-marketing-consent/decline": { + "/user/email-marketing-consent/seen": { "post": { "tags": [ "users" ], - "summary": "Record explicit decline for email marketing consent.", - "operationId": "user_email_marketing_consent_decline_post", + "summary": "Mark the email-marketing modal as seen/dismissed for the authenticated user.", + "operationId": "user_email_marketing_consent_seen_post", "responses": { "204": { "description": "successful operation, no content", @@ -21324,7 +23720,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_user_email_marketing_consent_decline", + "operationId": "options_user_email_marketing_consent_seen", "responses": { "204": { "description": "resource updated", @@ -21405,16 +23801,17 @@ "x-billable": false } }, - "/user/email-marketing-consent/request": { - "post": { + "/user/extended": { + "get": { "tags": [ "users" ], - "summary": "Request email marketing opt-in and send a confirmation email.", - "operationId": "user_email_marketing_consent_request_post", + "summary": "Get extended information about your user.", + "description": "Get the user information for the authenticated user.\n\nAlternatively, you can also use the `/users-extended/me` endpoint.", + "operationId": "get_user_self_extended", "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -21480,6 +23877,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExtendedUser" + } + } } }, "4XX": { @@ -21490,6 +23894,126 @@ } }, "x-billable": false + } + }, + "/user/factory/finishes": { + "get": { + "tags": [ + "factory" + ], + "summary": "List finishes currently available for customer Factory submissions.", + "description": "Internal-only entries are omitted. Results are ordered alphabetically, ignoring case, with \"Other\" last. Clients should refetch this endpoint after a catalog validation error before asking the customer to choose again.", + "operationId": "get_user_factory_finishes", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "Access-Control-Allow-Credentials": { + "description": "Access-Control-Allow-Credentials header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Headers": { + "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Methods": { + "description": "Access-Control-Allow-Methods header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Access-Control-Allow-Origin": { + "description": "Access-Control-Allow-Origin header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Content-Location": { + "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Location": { + "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "Set-Cookie": { + "description": "Set-Cookie header.", + "style": "simple", + "schema": { + "nullable": true, + "type": "string" + } + }, + "X-Api-Call-Id": { + "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", + "style": "simple", + "required": true, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FactoryCustomerCatalogOptionResultsPage" + } + } + } + }, + "4XX": { + "$ref": "#/components/responses/Error" + }, + "5XX": { + "$ref": "#/components/responses/Error" + } + }, + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } }, "options": { "tags": [ @@ -21497,7 +24021,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_user_email_marketing_consent_request", + "operationId": "options_get_user_factory_finishes", "responses": { "204": { "description": "resource updated", @@ -21578,16 +24102,46 @@ "x-billable": false } }, - "/user/email-marketing-consent/seen": { - "post": { + "/user/factory/jobs": { + "get": { "tags": [ - "users" + "factory" + ], + "summary": "List your personal Factory jobs.", + "description": "Returns jobs owned by your account, including archived jobs. Jobs with an organization owner belong to that organization, even when your account is also associated with them; use `GET /org/factory/jobs` to list those jobs. Results are paginated, newest first by default, with the job id breaking ties. Internal communication, financial details, and file storage locations are omitted.", + "operationId": "list_user_factory_jobs", + "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" + } + } ], - "summary": "Mark the email-marketing modal as seen/dismissed for the authenticated user.", - "operationId": "user_email_marketing_consent_seen_post", "responses": { - "204": { - "description": "successful operation, no content", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -21653,6 +24207,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FactoryCustomerJobSummaryResultsPage" + } + } } }, "4XX": { @@ -21662,18 +24223,33 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } }, - "options": { + "post": { "tags": [ + "factory", "hidden" ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_user_email_marketing_consent_seen", + "summary": "Submit a part for manufacturing. Requires a signed-in Zoo account.", + "description": "The request is `multipart/form-data`: - one JSON part named `body` (`FactoryIntakeForm`) whose `fields` object holds intake data (material, finish, quantity, notes, …). Material and finish are required customer-visible catalog names; all other fields are stored verbatim so they can be added or renamed without an API change. - one or more file parts (any part name). At least one file is required.\n\nThe submitter's identity (email, name, user id) comes from the authenticated account, not the form.\n\nFetch `GET /user/factory/materials` and `GET /user/factory/finishes`, then send the returned exact `material` and `finish` names. The server rejects missing, non-string, unknown, deleted, and internal-only choices with these stable field-specific `error_code` values: - `factory_material_input_missing` - `factory_material_input_invalid_type` - `factory_material_not_found` - `factory_material_not_customer_visible` - `factory_finish_input_missing` - `factory_finish_input_invalid_type` - `factory_finish_not_found` - `factory_finish_not_customer_visible` - `quantity`: a positive integer.\n\nExample `body` part: ```json { \"fields\": { \"material\": \"6061 Aluminum\", \"finish\": \"Anodized\", \"quantity\": 10, \"notes\": \"deburr all edges\" } } ```\n\nExample request (curl): ``` curl -X POST https://api.zoo.dev/user/factory/jobs \\ -H \"Authorization: Bearer $ZOO_API_TOKEN\" \\ -F 'body={\"fields\":{\"material\":\"6061 Aluminum\",\"finish\":\"Anodized\",\"quantity\":10}};type=application/json' \\ -F 'file=@bracket.step' ```\n\nReturns `201` with the created job (`FactoryJobResponse`).", + "operationId": "create_user_factory_job", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "string", + "format": "binary" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "resource updated", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -21739,6 +24315,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FactoryJobResponse" + } + } } }, "4XX": { @@ -21749,19 +24332,17 @@ } }, "x-billable": false - } - }, - "/user/extended": { - "get": { + }, + "options": { "tags": [ - "users" + "hidden" ], - "summary": "Get extended information about your user.", - "description": "Get the user information for the authenticated user.\n\nAlternatively, you can also use the `/users-extended/me` endpoint.", - "operationId": "get_user_self_extended", + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_create_user_factory_job", "responses": { - "200": { - "description": "successful operation", + "204": { + "description": "resource updated", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -21827,13 +24408,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExtendedUser" - } - } } }, "4XX": { @@ -21846,33 +24420,21 @@ "x-billable": false } }, - "/user/factory/finishes": { + "/user/factory/jobs/{job_id}": { "get": { "tags": [ "factory" ], - "summary": "List finishes currently available for customer Factory submissions.", - "description": "Internal-only entries are omitted. Results are ordered alphabetically, ignoring case, with \"Other\" last. Clients should refetch this endpoint after a catalog validation error before asking the customer to choose again.", - "operationId": "get_user_factory_finishes", + "summary": "Get a personal Factory job and its current customer-visible specifications.", + "operationId": "get_user_factory_job", "parameters": [ { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", + "in": "path", + "name": "job_id", + "description": "The requested job's identifier.", + "required": true, "schema": { - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/Uuid" } } ], @@ -21948,7 +24510,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FactoryCustomerCatalogOptionResultsPage" + "$ref": "#/components/schemas/FactoryCustomerJobDetail" } } } @@ -21960,10 +24522,7 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false }, "options": { "tags": [ @@ -21971,10 +24530,21 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_get_user_factory_finishes", + "operationId": "options_get_user_factory_job", + "parameters": [ + { + "in": "path", + "name": "job_id", + "description": "The requested job's identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], "responses": { "204": { - "description": "resource updated", + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -22052,154 +24622,75 @@ "x-billable": false } }, - "/user/factory/jobs": { + "/user/factory/jobs/{job_id}/files/{file_id}": { "get": { "tags": [ "factory" ], - "summary": "List your personal Factory jobs.", - "description": "Returns jobs owned by your account, including archived jobs. Jobs with an organization owner belong to that organization, even when your account is also associated with them; use `GET /org/factory/jobs` to list those jobs. Results are paginated, newest first by default, with the job id breaking ties. Internal communication, financial details, and file storage locations are omitted.", - "operationId": "list_user_factory_jobs", + "summary": "Download an exact submitted manufacturing input of a personal Factory job.", + "operationId": "get_user_factory_job_file", "parameters": [ { - "in": "query", - "name": "limit", - "description": "Maximum number of items returned by a single call", - "schema": { - "nullable": true, - "type": "integer", - "format": "uint32", - "minimum": 1 - } - }, - { - "in": "query", - "name": "page_token", - "description": "Token returned by previous call to retrieve the subsequent page", + "in": "path", + "name": "job_id", + "description": "Stable job identifier.", + "required": true, "schema": { - "nullable": true, - "type": "string" + "$ref": "#/components/schemas/Uuid" } }, { - "in": "query", - "name": "sort_by", + "in": "path", + "name": "file_id", + "description": "Submitted file identifier.", + "required": true, "schema": { - "$ref": "#/components/schemas/CreatedAtSortMode" + "$ref": "#/components/schemas/Uuid" } } ], "responses": { - "200": { - "description": "successful operation", - "headers": { - "Access-Control-Allow-Credentials": { - "description": "Access-Control-Allow-Credentials header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Headers": { - "description": "Access-Control-Allow-Headers header. This is a comma-separated list of headers.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Methods": { - "description": "Access-Control-Allow-Methods header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Access-Control-Allow-Origin": { - "description": "Access-Control-Allow-Origin header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Content-Location": { - "description": "The Content-Location header for responses that are not the final destination. This is used to indicate where the resource can be found, when it is finished.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Location": { - "description": "The location header for redirects and letting users know if there is a websocket they can listen to for status updates on their operation.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "Set-Cookie": { - "description": "Set-Cookie header.", - "style": "simple", - "schema": { - "nullable": true, - "type": "string" - } - }, - "X-Api-Call-Id": { - "description": "ID for this request. We return it so that users can report this to us and help us debug their problems.", - "style": "simple", - "required": true, - "schema": { - "type": "string" - } - } - }, + "default": { + "description": "", "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FactoryCustomerJobSummaryResultsPage" - } + "*/*": { + "schema": {} } } - }, - "4XX": { - "$ref": "#/components/responses/Error" - }, - "5XX": { - "$ref": "#/components/responses/Error" } }, - "x-billable": false, - "x-dropshot-pagination": { - "required": [] - } + "x-billable": false }, - "post": { + "options": { "tags": [ - "factory", "hidden" ], - "summary": "Submit a part for manufacturing. Requires a signed-in Zoo account.", - "description": "The request is `multipart/form-data`: - one JSON part named `body` (`FactoryIntakeForm`) whose `fields` object holds intake data (material, finish, quantity, notes, …). Material and finish are required customer-visible catalog names; all other fields are stored verbatim so they can be added or renamed without an API change. - one or more file parts (any part name). At least one file is required.\n\nThe submitter's identity (email, name, user id) comes from the authenticated account, not the form.\n\nFetch `GET /user/factory/materials` and `GET /user/factory/finishes`, then send the returned exact `material` and `finish` names. The server rejects missing, non-string, unknown, deleted, and internal-only choices with these stable field-specific `error_code` values: - `factory_material_input_missing` - `factory_material_input_invalid_type` - `factory_material_not_found` - `factory_material_not_customer_visible` - `factory_finish_input_missing` - `factory_finish_input_invalid_type` - `factory_finish_not_found` - `factory_finish_not_customer_visible` - `quantity`: a positive integer.\n\nExample `body` part: ```json { \"fields\": { \"material\": \"6061 Aluminum\", \"finish\": \"Anodized\", \"quantity\": 10, \"notes\": \"deburr all edges\" } } ```\n\nExample request (curl): ``` curl -X POST https://api.zoo.dev/user/factory/jobs \\ -H \"Authorization: Bearer $ZOO_API_TOKEN\" \\ -F 'body={\"fields\":{\"material\":\"6061 Aluminum\",\"finish\":\"Anodized\",\"quantity\":10}};type=application/json' \\ -F 'file=@bracket.step' ```\n\nReturns `201` with the created job (`FactoryJobResponse`).", - "operationId": "create_user_factory_job", - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "type": "string", - "format": "binary" - } + "summary": "OPTIONS endpoint.", + "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", + "operationId": "options_get_user_factory_job_file", + "parameters": [ + { + "in": "path", + "name": "job_id", + "description": "Stable job identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" } }, - "required": true - }, + { + "in": "path", + "name": "file_id", + "description": "Submitted file identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + } + ], "responses": { - "201": { - "description": "successful creation", + "204": { + "description": "successful operation, no content", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -22265,13 +24756,6 @@ "type": "string" } } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FactoryJobResponse" - } - } } }, "4XX": { @@ -22282,17 +24766,56 @@ } }, "x-billable": false - }, - "options": { + } + }, + "/user/factory/jobs/{job_id}/versions": { + "get": { "tags": [ - "hidden" + "factory" + ], + "summary": "List a personal Factory job's submitted revision history, newest first by default.", + "operationId": "list_user_factory_job_versions", + "parameters": [ + { + "in": "path", + "name": "job_id", + "description": "The requested job's identifier.", + "required": true, + "schema": { + "$ref": "#/components/schemas/Uuid" + } + }, + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "schema": { + "$ref": "#/components/schemas/CreatedAtSortMode" + } + } ], - "summary": "OPTIONS endpoint.", - "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_create_user_factory_job", "responses": { - "204": { - "description": "resource updated", + "200": { + "description": "successful operation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -22358,6 +24881,13 @@ "type": "string" } } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FactoryCustomerJobVersionResultsPage" + } + } } }, "4XX": { @@ -22367,16 +24897,17 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false - } - }, - "/user/factory/jobs/{job_id}": { - "get": { + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } + }, + "post": { "tags": [ "factory" ], - "summary": "Get a personal Factory job and its current customer-visible specifications.", - "operationId": "get_user_factory_job", + "summary": "Submit a complete new revision of a personal Factory job.", + "operationId": "create_user_factory_job_version", "parameters": [ { "in": "path", @@ -22388,9 +24919,20 @@ } } ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "type": "string", + "format": "binary" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "successful operation", + "201": { + "description": "successful creation", "headers": { "Access-Control-Allow-Credentials": { "description": "Access-Control-Allow-Credentials header.", @@ -22460,7 +25002,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/FactoryCustomerJobDetail" + "$ref": "#/components/schemas/FactoryJobResponse" } } } @@ -22480,7 +25022,7 @@ ], "summary": "OPTIONS endpoint.", "description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.", - "operationId": "options_get_user_factory_job", + "operationId": "options_create_user_factory_job_version", "parameters": [ { "in": "path", @@ -26148,7 +28690,7 @@ "projects" ], "summary": "List personal libraries and libraries belonging to the active organization.", - "description": "Returns an object with `items` and `next_page`, ordered by library ID. Request the next page with `?page_token=` until `next_page` is null. Keep the same authenticated user and active organization for every page; changing that context requires starting a new list request.\n\nEach library has a stable `id`, a display `name`, either `user_id` or `org_id`, an opaque `revision`, and `can_manage`. Use the ID to track a library across renames. `can_manage` allows renaming/deleting the library, not editing all of its projects. Organization members can discover libraries; only organization admins can manage them. Project permissions remain unchanged.\n\nProjects with `library_id: null` have no named library. They do not appear as a library record here. Use `GET /user/projects?scope=personal&unassigned=true` for the default personal group, or `scope=organization&unassigned=true` for the active organization's unassigned projects.\n\nEach library includes its creation source: `zds` or `factory_portal`. Libraries created before source tracking are returned as `zds`. Clients can filter the results by source; API permissions remain unchanged.", + "description": "Returns an object with `items` and `next_page`, ordered by library ID. Request the next page with `?page_token=` until `next_page` is null. Keep the same authenticated user and active organization for every page; changing that context requires starting a new list request.\n\nEach library has a stable `id`, a display `name`, either `user_id` or `org_id`, an opaque `revision`, and `can_manage`. Use the ID to track a library across renames. `can_manage` allows renaming/deleting the library, not editing all of its projects. Organization members can discover libraries; only organization admins can manage them. Project permissions remain unchanged.\n\nProjects with `library_id: null` have no named library. They do not appear as a library record here. Use `GET /user/projects?scope=personal&unassigned=true` for the default personal group, or `scope=organization&unassigned=true` for the active organization's unassigned projects.\n\nEach library includes its creation source: `zds`, `factory_portal`, or `org_dataset`. Libraries created before source tracking are returned as `zds`. Clients can filter the results by source; API permissions remain unchanged.", "operationId": "list_project_libraries", "parameters": [ { @@ -26266,7 +28808,7 @@ "projects" ], "summary": "Create a personal library or a library owned by the active organization.", - "description": "Send JSON with a name and explicit ownership scope:\n\n```json { \"name\": \"Designs\", \"scope\": \"personal\" } ```\n\nUse `scope: \"organization\"` to create a library for the request's active organization; this requires organization-admin access. There is no organization ID in this body. Personal scope always uses the authenticated user.\n\nNames are trimmed, must contain 1–255 characters, and are unique ignoring case within each user or organization. Display capitalization is preserved. Duplicate names return HTTP 409. The HTTP 201 response contains the library ID, ownership, revision, and `can_manage`. Creating a library does not move existing projects; select its ID when creating a project, or move an existing project with `PUT /user/projects/{id}/library`.\n\nInclude `source` to identify the application that created the library:\n\n```json { \"name\": \"Factory designs\", \"scope\": \"personal\", \"source\": \"factory_portal\" } ```\n\nAccepted sources are `zds` and `factory_portal`. Omitting source defaults to `zds`. Null and unsupported values return HTTP 400.\n\nSource is returned in library responses and cannot be changed after creation. Clients use it to decide how to display libraries; it does not change API permissions. No API source filter is provided at the moment.", + "description": "Send JSON with a name and explicit ownership scope:\n\n```json { \"name\": \"Designs\", \"scope\": \"personal\" } ```\n\nUse `scope: \"organization\"` to create a library for the request's active organization; this requires organization-admin access. There is no organization ID in this body. Personal scope always uses the authenticated user.\n\nNames are trimmed, must contain 1–255 characters, and are unique ignoring case within each user or organization. Display capitalization is preserved. Duplicate names return HTTP 409. The HTTP 201 response contains the library ID, ownership, revision, and `can_manage`. Creating a library does not move existing projects; select its ID when creating a project, or move an existing project with `PUT /user/projects/{id}/library`.\n\nInclude `source` to identify the application that created the library:\n\n```json { \"name\": \"Factory designs\", \"scope\": \"personal\", \"source\": \"factory_portal\" } ```\n\nAccepted sources are `zds`, `factory_portal`, and `org_dataset`. Omitting source defaults to `zds`. Null and unsupported values return HTTP 400.\n\nSource is returned in library responses and cannot be changed after creation. Clients use it to decide how to display libraries; it does not change API permissions. No API source filter is provided at the moment.", "operationId": "create_project_library", "requestBody": { "content": { @@ -26457,7 +28999,7 @@ "projects" ], "summary": "Delete an empty cloud project library.", - "description": "Supply the library's last-read `revision` as the required `expected_revision` query parameter. URL-encode this value. Only the personal owner or an admin of the active organization can delete the library.\n\nMove or unassign all projects first. A nonempty library or stale revision returns HTTP 409. Success returns HTTP 204 without deleting projects or history. Library revisions are separate from project `revision` and `metadata_revision`.", + "description": "Supply the library's last-read `revision` as the required `expected_revision` query parameter. URL-encode this value. Only the personal owner or an admin of the active organization can delete the library. Libraries managed by an organization dataset cannot be deleted independently; those requests return HTTP 409.\n\nMove or unassign all projects first. A nonempty library or stale revision returns HTTP 409. Success returns HTTP 204 without deleting projects or history. Library revisions are separate from project `revision` and `metadata_revision`.", "operationId": "delete_project_library", "parameters": [ { @@ -27002,9 +29544,29 @@ "projects" ], "summary": "List the authenticated user's projects.", - "description": "Returns an array, including personal projects and projects accessible through the request's active organization. Optional `scope=personal` or `scope=organization` narrows ownership; `unassigned=true` includes only projects whose `library_id` is null. Combine them, for example: `GET /user/projects?scope=personal&unassigned=true`. Omitting both filters keeps returning all accessible projects, including projects in named libraries.\n\nUnassigned is a grouping within the existing ownership scope, not a stored default library. Use `GET /user/project-libraries/{id}/projects` for a named library's paginated project list. Filters do not grant additional access.", + "description": "Returns a page, including personal projects and projects accessible through the request's active organization. Optional `scope=personal` or `scope=organization` narrows ownership; `unassigned=true` includes only projects whose `library_id` is null. Combine them, for example: `GET /user/projects?scope=personal&unassigned=true`. Omitting both filters keeps returning all accessible projects, including projects in named libraries.\n\nUnassigned is a grouping within the existing ownership scope, not a stored default library. Use `GET /user/project-libraries/{id}/projects` for a named library's paginated project list. Filters do not grant additional access.", "operationId": "list_projects", "parameters": [ + { + "in": "query", + "name": "limit", + "description": "Maximum number of items returned by a single call", + "schema": { + "nullable": true, + "type": "integer", + "format": "uint32", + "minimum": 1 + } + }, + { + "in": "query", + "name": "page_token", + "description": "Token returned by previous call to retrieve the subsequent page", + "schema": { + "nullable": true, + "type": "string" + } + }, { "in": "query", "name": "scope", @@ -27094,11 +29656,7 @@ "content": { "application/json": { "schema": { - "title": "Array_of_ProjectSummaryResponse", - "type": "array", - "items": { - "$ref": "#/components/schemas/ProjectSummaryResponse" - } + "$ref": "#/components/schemas/ProjectSummaryResponseResultsPage" } } } @@ -27110,7 +29668,10 @@ "$ref": "#/components/responses/Error" } }, - "x-billable": false + "x-billable": false, + "x-dropshot-pagination": { + "required": [] + } }, "post": { "tags": [ @@ -27721,7 +30282,8 @@ "tags": [ "projects" ], - "summary": "Download one of the authenticated user's projects as a tar archive.", + "summary": "Download all or selected files from the current version of a project.", + "description": "Use `file_ids=,` to select files from the current version. This endpoint resolves the project's current version at request time, so file IDs from before a save may no longer belong to it. To download those files, use `/user/projects/{id}/versions/{version_id}/download` with `version_id` set to the `summary.revision` returned alongside that file list. A single selected file still uses the requested tar or zip archive format.", "operationId": "download_project", "parameters": [ { @@ -27740,6 +30302,20 @@ "schema": { "$ref": "#/components/schemas/ProjectArchiveFormat" } + }, + { + "in": "query", + "name": "file_ids", + "description": "Optional comma-separated file IDs from this download's version. Omit to download every file. An empty or malformed list returns HTTP 400 with `error_code: InvalidProjectFileIds`. Any ID outside this version returns HTTP 400 with `error_code: InvalidProjectFileSelection` and a `missing_file_ids` array listing the requested IDs absent from this version. The entire selection fails: requesting ten IDs with one missing returns HTTP 400 without an archive. Missing projects or versions still return HTTP 404. Repeated IDs are included once. Selecting one file still returns the requested archive format.", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "minItems": 1 + }, + "explode": false } ], "responses": { @@ -27750,6 +30326,16 @@ "schema": {} } } + }, + "400": { + "description": "Invalid download parameters. InvalidProjectFileSelection includes missing_file_ids.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectDownloadErrorResponse" + } + } + } } }, "x-billable": false @@ -29715,7 +32301,8 @@ "tags": [ "projects" ], - "summary": "Download the files saved in one project version.", + "summary": "Download all or selected files saved in one project version.", + "description": "Select files with `file_ids=,`. IDs must belong to this version; omitted files are excluded, including the manifest unless explicitly selected. The response is a tar or zip archive even when selecting one file.", "operationId": "download_project_version", "parameters": [ { @@ -29743,6 +32330,20 @@ "schema": { "$ref": "#/components/schemas/ProjectArchiveFormat" } + }, + { + "in": "query", + "name": "file_ids", + "description": "Optional comma-separated file IDs from this download's version. Omit to download every file. An empty or malformed list returns HTTP 400 with `error_code: InvalidProjectFileIds`. Any ID outside this version returns HTTP 400 with `error_code: InvalidProjectFileSelection` and a `missing_file_ids` array listing the requested IDs absent from this version. The entire selection fails: requesting ten IDs with one missing returns HTTP 400 without an archive. Missing projects or versions still return HTTP 404. Repeated IDs are included once. Selecting one file still returns the requested archive format.", + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "minItems": 1 + }, + "explode": false } ], "responses": { @@ -29753,6 +32354,16 @@ "schema": {} } } + }, + "400": { + "description": "Invalid download parameters. InvalidProjectFileSelection includes missing_file_ids.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectDownloadErrorResponse" + } + } + } } }, "x-billable": false @@ -33284,6 +35895,27 @@ "role" ] }, + "AddressContact": { + "description": "Delivery contact fields shared by saved addresses and one-off destinations.", + "type": "object", + "properties": { + "company": { + "description": "Company name, or an empty string when absent.", + "default": "", + "type": "string" + }, + "phone": { + "description": "Delivery contact phone, or an empty string when absent.", + "default": "", + "type": "string" + }, + "recipient": { + "description": "Individual or department receiving the delivery.", + "default": "", + "type": "string" + } + } + }, "AddressDetails": { "description": "Address details.", "type": "object", @@ -33321,6 +35953,148 @@ "country" ] }, + "AddressPostalResponse": { + "description": "Postal fields as stored, including incomplete historical billing addresses.", + "type": "object", + "properties": { + "city": { + "description": "City or locality.", + "type": "string" + }, + "country": { + "description": "Two-letter country code, or an uncorrected historical value.", + "type": "string" + }, + "state": { + "description": "State, province, or region when applicable.", + "type": "string" + }, + "street1": { + "description": "First street line.", + "type": "string" + }, + "street2": { + "description": "Optional second street line, represented by an empty string when absent.", + "type": "string" + }, + "zip": { + "description": "Postal code when applicable.", + "type": "string" + } + }, + "required": [ + "city", + "country", + "state", + "street1", + "street2", + "zip" + ] + }, + "AddressResponse": { + "description": "One address-book card and its current immutable contents.", + "type": "object", + "properties": { + "can_manage": { + "description": "Whether this caller can edit/archive the card through these endpoints.", + "type": "boolean" + }, + "contact": { + "description": "Recipient, company, and phone attached to this revision.", + "allOf": [ + { + "$ref": "#/components/schemas/AddressContact" + } + ] + }, + "created_at": { + "title": "DateTime", + "description": "When the card was created.", + "type": "string", + "format": "date-time" + }, + "id": { + "description": "Stable address-book identifier. Edits preserve this ID.", + "allOf": [ + { + "$ref": "#/components/schemas/Uuid" + } + ] + }, + "is_billing": { + "description": "Billing edits use the existing payment endpoints to update the provider.", + "type": "boolean" + }, + "is_default_shipping": { + "description": "Whether this card is the owner's selected shipping default.", + "type": "boolean" + }, + "is_saved": { + "description": "False for a one-off destination omitted from address-book listings.", + "type": "boolean" + }, + "label": { + "description": "Customer-visible label for this address-book card.", + "type": "string" + }, + "postal": { + "description": "Current postal destination.", + "allOf": [ + { + "$ref": "#/components/schemas/AddressPostalResponse" + } + ] + }, + "revision_id": { + "description": "Immutable postal/contact revision. Orders must pin this ID.", + "allOf": [ + { + "$ref": "#/components/schemas/Uuid" + } + ] + }, + "updated_at": { + "title": "DateTime", + "description": "When the card was most recently edited.", + "type": "string", + "format": "date-time" + } + }, + "required": [ + "can_manage", + "contact", + "created_at", + "id", + "is_billing", + "is_default_shipping", + "is_saved", + "label", + "postal", + "revision_id", + "updated_at" + ] + }, + "AddressResponseResultsPage": { + "description": "A single page of results", + "type": "object", + "properties": { + "items": { + "description": "list of items on this page of results", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddressResponse" + } + }, + "next_page": { + "nullable": true, + "description": "token used to fetch the next page of results (if any)", + "type": "string" + } + }, + "required": [ + "items" + ] + }, "AdjacencyInfo": { "description": "Edge info struct (useful for maintaining mappings between edges and faces and adjacent/opposite edges).", "type": "object", @@ -34207,20 +36981,25 @@ "updated_at" ] }, - "AnnouncementList": { - "description": "Response containing active announcements.", + "AnnouncementResultsPage": { + "description": "A single page of results", "type": "object", "properties": { - "announcements": { - "description": "The list of active announcements.", + "items": { + "description": "list of items on this page of results", "type": "array", "items": { "$ref": "#/components/schemas/Announcement" } + }, + "next_page": { + "nullable": true, + "description": "token used to fetch the next page of results (if any)", + "type": "string" } }, "required": [ - "announcements" + "items" ] }, "ApiCallStatus": { @@ -37312,6 +40091,48 @@ } } }, + "CreateAddressRequest": { + "description": "Create a saved card or an owned one-off destination. Billing is unchanged.", + "type": "object", + "properties": { + "contact": { + "description": "Delivery contact. Recipient is required; company and phone may be empty.", + "allOf": [ + { + "$ref": "#/components/schemas/AddressContact" + } + ] + }, + "is_default_shipping": { + "description": "Select this saved card as the shipping default without changing billing.", + "default": false, + "type": "boolean" + }, + "is_saved": { + "description": "Defaults to true. Set false for an order-only destination.", + "default": true, + "type": "boolean" + }, + "label": { + "description": "Customer-visible label, such as Home or Workshop.", + "default": "", + "type": "string" + }, + "postal": { + "description": "Postal destination. Accepts zip or postal_code.", + "allOf": [ + { + "$ref": "#/components/schemas/AddressDetails" + } + ] + } + }, + "required": [ + "contact", + "postal" + ], + "additionalProperties": false + }, "CreateCustomModel": { "description": "Body for creating a custom ML model.", "type": "object", @@ -40092,6 +42913,24 @@ "job" ] }, + "FactoryCustomerJobFile": { + "description": "Minimized submitted-file metadata, without Project identifiers or storage locations.", + "type": "object", + "properties": { + "download_url": { + "description": "Authenticated Factory download URL.", + "type": "string" + }, + "file_name": { + "description": "Submitted file's display name.", + "type": "string" + } + }, + "required": [ + "download_url", + "file_name" + ] + }, "FactoryCustomerJobSummary": { "description": "Customer-visible summary of a manufacturing job.", "type": "object", @@ -40159,7 +42998,7 @@ ] }, "FactoryCustomerJobVersion": { - "description": "Customer-visible snapshot of the current job version. File names are display metadata; no private storage URI or download capability is exposed.", + "description": "Customer-visible submitted snapshot with authenticated Factory download links.", "type": "object", "properties": { "created_at": { @@ -40175,8 +43014,15 @@ "type": "string" } }, + "files": { + "description": "Submitted input names and authenticated download links.", + "type": "array", + "items": { + "$ref": "#/components/schemas/FactoryCustomerJobFile" + } + }, "id": { - "description": "Identifier of the current version.", + "description": "Identifier of this Factory revision.", "allOf": [ { "$ref": "#/components/schemas/Uuid" @@ -40190,17 +43036,39 @@ "required": [ "created_at", "file_names", + "files", "id", "specs" ] }, + "FactoryCustomerJobVersionResultsPage": { + "description": "A single page of results", + "type": "object", + "properties": { + "items": { + "description": "list of items on this page of results", + "type": "array", + "items": { + "$ref": "#/components/schemas/FactoryCustomerJobVersion" + } + }, + "next_page": { + "nullable": true, + "description": "token used to fetch the next page of results (if any)", + "type": "string" + } + }, + "required": [ + "items" + ] + }, "FactoryJobResponse": { "description": "Response returned when a Factory job is created. Only customer-facing ids are exposed: the job id (the customer's reference) and its current version id. The internal Help Desk thread id is deliberately NOT returned (internal-only per the ERD).", "type": "object", "properties": { "current_version_id": { "nullable": true, - "description": "The current (first) version id of the job.", + "description": "The newly submitted Factory version id of the job.", "allOf": [ { "$ref": "#/components/schemas/Uuid" @@ -40216,7 +43084,7 @@ ] }, "status": { - "description": "The initial workflow status (`new`).", + "description": "The workflow status after submission (`new` for creation, `quoting` for a revision).", "type": "string" } }, @@ -40330,6 +43198,20 @@ "factory_portal" ] }, + { + "description": "Enables the authenticated hosted MCP proxy.", + "type": "string", + "enum": [ + "hosted_mcp" + ] + }, + { + "description": "Store org dataset conversions in organization-shared cloud project libraries.", + "type": "string", + "enum": [ + "org_dataset_cloud_projects" + ] + }, { "description": "KCL CEK machine executor.", "type": "string", @@ -40408,17 +43290,17 @@ ] }, { - "description": "Enables modeling dialogs in Zoo Design Studio.", + "description": "Enables the Scene browser and model tree UI in Zoo Design Studio.", "type": "string", "enum": [ - "modeling_dialogs" + "scene_browser" ] }, { - "description": "Enables the Scene browser and model tree UI in Zoo Design Studio.", + "description": "Enables the refactored project shell in Zoo Design Studio.", "type": "string", "enum": [ - "scene_browser" + "zds_project_shell_refactor" ] }, { @@ -42710,6 +45592,33 @@ "completions" ] }, + "KclFile": { + "description": "A file in a KCL project.", + "type": "object", + "properties": { + "contents": { + "description": "Raw file contents. KCL source is UTF-8; imported assets may be binary.", + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0 + } + }, + "path": { + "description": "Where is the file, relative to the project directory?", + "allOf": [ + { + "$ref": "#/components/schemas/SafeFilepath" + } + ] + } + }, + "required": [ + "contents", + "path" + ] + }, "KclMigrationApplication": { "description": "A revision-fenced acknowledgement from the client that owns the project files.", "type": "object", @@ -43447,6 +46356,31 @@ "code" ] }, + "KclProject": { + "description": "A KCL project.", + "type": "object", + "properties": { + "entrypoint": { + "description": "Which file is the entrypoint? This is the first KCL file to be executed, the root of the KCL module tree.", + "allOf": [ + { + "$ref": "#/components/schemas/SafeFilepath" + } + ] + }, + "files": { + "description": "All files in the project.", + "type": "array", + "items": { + "$ref": "#/components/schemas/KclFile" + } + } + }, + "required": [ + "entrypoint", + "files" + ] + }, "KclProjectFileRole": { "description": "Logical role of a file stored under a KCL project.", "oneOf": [ @@ -43489,6 +46423,13 @@ "enum": [ "factory_portal" ] + }, + { + "description": "Created by organization dataset conversion automation.", + "type": "string", + "enum": [ + "org_dataset" + ] } ] }, @@ -44331,6 +47272,70 @@ "type" ] }, + { + "description": "Explicitly request a sponsored migration in this conversation. This action does not grant execution or bypass API eligibility checks. Progress and the final answer use the ordinary Copilot messages.", + "type": "object", + "properties": { + "request": { + "description": "Complete isolated input. API binds it to the active conversation; a supplied conversation ID must match that conversation.", + "allOf": [ + { + "$ref": "#/components/schemas/KclMigrationRequest" + } + ] + }, + "type": { + "type": "string", + "enum": [ + "migrate_kcl" + ] + } + }, + "required": [ + "request", + "type" + ] + }, + { + "description": "Report Apply/Undo/Redo without creating or charging for a chat turn.", + "type": "object", + "properties": { + "expected_revision": { + "description": "Last acknowledged revision. Retrying the same change is idempotent.", + "type": "integer", + "format": "uint32", + "minimum": 0 + }, + "operation_id": { + "description": "Migration request ID, independent of the connection and prompt IDs.", + "allOf": [ + { + "$ref": "#/components/schemas/Uuid" + } + ] + }, + "status": { + "description": "Client-reported project state.", + "allOf": [ + { + "$ref": "#/components/schemas/KclMigrationApplicationStatus" + } + ] + }, + "type": { + "type": "string", + "enum": [ + "kcl_migration_application" + ] + } + }, + "required": [ + "expected_revision", + "operation_id", + "status", + "type" + ] + }, { "description": "Request persisted attachments from conversation history over the active websocket.", "type": "object", @@ -44882,6 +47887,67 @@ ], "additionalProperties": false }, + { + "description": "API-owned migration state. Candidate files are released only after API validates and stores the worker result. Replaying conversation history must not apply these files again.", + "type": "object", + "properties": { + "kcl_migration_operation": { + "type": "object", + "properties": { + "operation": { + "description": "Durable migration outcome and the source snapshot it was based on.", + "allOf": [ + { + "$ref": "#/components/schemas/KclMigrationOperation" + } + ] + } + }, + "required": [ + "operation" + ] + } + }, + "required": [ + "kcl_migration_operation" + ], + "additionalProperties": false + }, + { + "description": "Acknowledge the client's reported Apply/Undo/Redo state.", + "type": "object", + "properties": { + "kcl_migration_application": { + "type": "object", + "properties": { + "application": { + "description": "Accepted state and revision for subsequent acknowledgements.", + "allOf": [ + { + "$ref": "#/components/schemas/KclMigrationApplication" + } + ] + }, + "operation_id": { + "description": "Migration request ID.", + "allOf": [ + { + "$ref": "#/components/schemas/Uuid" + } + ] + } + }, + "required": [ + "application", + "operation_id" + ] + } + }, + "required": [ + "kcl_migration_application" + ], + "additionalProperties": false + }, { "description": "Log / banner text.", "type": "object", @@ -47305,6 +50371,15 @@ } ] }, + "kcl_source": { + "nullable": true, + "description": "KCL source to embed in formats that support source metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/KclProject" + } + ] + }, "type": { "type": "string", "enum": [ @@ -47338,6 +50413,15 @@ } ] }, + "kcl_source": { + "nullable": true, + "description": "KCL source to embed in formats that support source metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/KclProject" + } + ] + }, "type": { "type": "string", "enum": [ @@ -58310,6 +61394,53 @@ "sort_order" ] }, + "ProjectCategoryResponseResultsPage": { + "description": "A single page of results", + "type": "object", + "properties": { + "items": { + "description": "list of items on this page of results", + "type": "array", + "items": { + "$ref": "#/components/schemas/ProjectCategoryResponse" + } + }, + "next_page": { + "nullable": true, + "description": "token used to fetch the next page of results (if any)", + "type": "string" + } + }, + "required": [ + "items" + ] + }, + "ProjectDownloadErrorResponse": { + "description": "Error returned when project download query parameters are invalid.", + "type": "object", + "properties": { + "error_code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "missing_file_ids": { + "description": "Requested IDs absent from the resolved project version. Present for `InvalidProjectFileSelection`, with duplicate IDs listed once.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Uuid" + } + }, + "request_id": { + "type": "string" + } + }, + "required": [ + "message", + "request_id" + ] + }, "ProjectEntityToPlane": { "description": "The response from the `ProjectEntityToPlane` command.", "type": "object", @@ -59972,6 +63103,10 @@ "type" ] }, + "SafeFilepath": { + "description": "Filepath which is guaranteed to be relative and not contain parent directory jumps like '..'", + "type": "string" + }, "SalesInquiryType": { "description": "The type of sales inquiry for website sales forms.", "oneOf": [ @@ -64123,6 +67258,52 @@ "user_id" ] }, + "UpdateAddressRequest": { + "description": "Replace a delivery card without changing revisions already used by orders.", + "type": "object", + "properties": { + "contact": { + "description": "Replacement recipient, company, and phone.", + "allOf": [ + { + "$ref": "#/components/schemas/AddressContact" + } + ] + }, + "expected_revision": { + "description": "revision_id returned when the card was loaded. Stale edits return 409.", + "allOf": [ + { + "$ref": "#/components/schemas/Uuid" + } + ] + }, + "is_default_shipping": { + "description": "Select or clear this card as the default shipping destination.", + "type": "boolean" + }, + "label": { + "description": "Replacement card label.", + "type": "string" + }, + "postal": { + "description": "Replacement postal destination.", + "allOf": [ + { + "$ref": "#/components/schemas/AddressDetails" + } + ] + } + }, + "required": [ + "contact", + "expected_revision", + "is_default_shipping", + "label", + "postal" + ], + "additionalProperties": false + }, "UpdateAnnotation": { "description": "The response from the `UpdateAnnotation` endpoint.", "type": "object" @@ -65488,7 +68669,7 @@ ] }, { - "description": "The Text-to-CAD UI.", + "description": "Zookeeper callbacks to the API.", "type": "string", "enum": [ "text_to_cad" @@ -65952,6 +69133,10 @@ } }, "tags": [ + { + "name": "addresses", + "description": "Saved delivery addresses and immutable address revisions." + }, { "name": "api-calls", "description": "API calls that have been performed by users can be queried by the API. This is helpful for debugging as well as billing.",