Update api spec (#435)

* YOYO NEW API SPEC!

* I have generated the latest API!

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This commit is contained in:
zoo-github-actions-auth[bot]
2025-05-11 11:51:16 -07:00
committed by GitHub
parent 1744ab6385
commit 24e80f4568
16 changed files with 2451 additions and 895 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,107 @@
from typing import Any, Dict, Optional
import httpx
from ...client import Client
from ...models.crm_data import CrmData
from ...models.error import Error
from ...types import Response
def _get_kwargs(
body: CrmData,
*,
client: Client,
) -> Dict[str, Any]:
url = "{}/user/crm".format(
client.base_url,
) # noqa: E501
headers: Dict[str, Any] = client.get_headers()
cookies: Dict[str, Any] = client.get_cookies()
return {
"url": url,
"headers": headers,
"cookies": cookies,
"timeout": client.get_timeout(),
"content": body.model_dump_json(),
}
def _parse_response(*, response: httpx.Response) -> Optional[Error]:
return None
if response.status_code == 400:
response_4XX = Error(**response.json())
return response_4XX
if response.status_code == 500:
response_5XX = Error(**response.json())
return response_5XX
return Error(**response.json())
def _build_response(*, response: httpx.Response) -> Response[Optional[Error]]:
return Response(
status_code=response.status_code,
content=response.content,
headers=response.headers,
parsed=_parse_response(response=response),
)
def sync_detailed(
body: CrmData,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
response = httpx.patch(
verify=client.verify_ssl,
**kwargs,
)
return _build_response(response=response)
def sync(
body: CrmData,
*,
client: Client,
) -> Optional[Error]:
return sync_detailed(
body=body,
client=client,
).parsed
async def asyncio_detailed(
body: CrmData,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
async with httpx.AsyncClient(verify=client.verify_ssl) as _client:
response = await _client.patch(**kwargs)
return _build_response(response=response)
async def asyncio(
body: CrmData,
*,
client: Client,
) -> Optional[Error]:
return (
await asyncio_detailed(
body=body,
client=client,
)
).parsed

View File

@ -0,0 +1,111 @@
from typing import Any, Dict, Optional
import httpx
from ...client import Client
from ...models.error import Error
from ...models.inquiry_form import InquiryForm
from ...types import Response
def _get_kwargs(
body: InquiryForm,
*,
client: Client,
) -> Dict[str, Any]:
url = "{}/website/form".format(
client.base_url,
) # noqa: E501
headers: Dict[str, Any] = client.get_headers()
cookies: Dict[str, Any] = client.get_cookies()
return {
"url": url,
"headers": headers,
"cookies": cookies,
"timeout": client.get_timeout(),
"content": body.model_dump_json(),
}
def _parse_response(*, response: httpx.Response) -> Optional[Error]:
return None
if response.status_code == 400:
response_4XX = Error(**response.json())
return response_4XX
if response.status_code == 500:
response_5XX = Error(**response.json())
return response_5XX
return Error(**response.json())
def _build_response(*, response: httpx.Response) -> Response[Optional[Error]]:
return Response(
status_code=response.status_code,
content=response.content,
headers=response.headers,
parsed=_parse_response(response=response),
)
def sync_detailed(
body: InquiryForm,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
response = httpx.put(
verify=client.verify_ssl,
**kwargs,
)
return _build_response(response=response)
def sync(
body: InquiryForm,
*,
client: Client,
) -> Optional[Error]:
"""users and is not authenticated.""" # noqa: E501
return sync_detailed(
body=body,
client=client,
).parsed
async def asyncio_detailed(
body: InquiryForm,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
async with httpx.AsyncClient(verify=client.verify_ssl) as _client:
response = await _client.put(**kwargs)
return _build_response(response=response)
async def asyncio(
body: InquiryForm,
*,
client: Client,
) -> Optional[Error]:
"""users and is not authenticated.""" # noqa: E501
return (
await asyncio_detailed(
body=body,
client=client,
)
).parsed

View File

@ -0,0 +1,107 @@
from typing import Any, Dict, Optional
import httpx
from ...client import Client
from ...models.error import Error
from ...models.subscribe import Subscribe
from ...types import Response
def _get_kwargs(
body: Subscribe,
*,
client: Client,
) -> Dict[str, Any]:
url = "{}/website/subscribe".format(
client.base_url,
) # noqa: E501
headers: Dict[str, Any] = client.get_headers()
cookies: Dict[str, Any] = client.get_cookies()
return {
"url": url,
"headers": headers,
"cookies": cookies,
"timeout": client.get_timeout(),
"content": body.model_dump_json(),
}
def _parse_response(*, response: httpx.Response) -> Optional[Error]:
return None
if response.status_code == 400:
response_4XX = Error(**response.json())
return response_4XX
if response.status_code == 500:
response_5XX = Error(**response.json())
return response_5XX
return Error(**response.json())
def _build_response(*, response: httpx.Response) -> Response[Optional[Error]]:
return Response(
status_code=response.status_code,
content=response.content,
headers=response.headers,
parsed=_parse_response(response=response),
)
def sync_detailed(
body: Subscribe,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
response = httpx.put(
verify=client.verify_ssl,
**kwargs,
)
return _build_response(response=response)
def sync(
body: Subscribe,
*,
client: Client,
) -> Optional[Error]:
return sync_detailed(
body=body,
client=client,
).parsed
async def asyncio_detailed(
body: Subscribe,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
async with httpx.AsyncClient(verify=client.verify_ssl) as _client:
response = await _client.put(**kwargs)
return _build_response(response=response)
async def asyncio(
body: Subscribe,
*,
client: Client,
) -> Optional[Error]:
return (
await asyncio_detailed(
body=body,
client=client,
)
).parsed

View File

@ -0,0 +1,111 @@
from typing import Any, Dict, Optional
import httpx
from ...client import Client
from ...models.error import Error
from ...models.inquiry_form import InquiryForm
from ...types import Response
def _get_kwargs(
body: InquiryForm,
*,
client: Client,
) -> Dict[str, Any]:
url = "{}/user/form".format(
client.base_url,
) # noqa: E501
headers: Dict[str, Any] = client.get_headers()
cookies: Dict[str, Any] = client.get_cookies()
return {
"url": url,
"headers": headers,
"cookies": cookies,
"timeout": client.get_timeout(),
"content": body.model_dump_json(),
}
def _parse_response(*, response: httpx.Response) -> Optional[Error]:
return None
if response.status_code == 400:
response_4XX = Error(**response.json())
return response_4XX
if response.status_code == 500:
response_5XX = Error(**response.json())
return response_5XX
return Error(**response.json())
def _build_response(*, response: httpx.Response) -> Response[Optional[Error]]:
return Response(
status_code=response.status_code,
content=response.content,
headers=response.headers,
parsed=_parse_response(response=response),
)
def sync_detailed(
body: InquiryForm,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
response = httpx.put(
verify=client.verify_ssl,
**kwargs,
)
return _build_response(response=response)
def sync(
body: InquiryForm,
*,
client: Client,
) -> Optional[Error]:
"""It gets attached to the user's account.""" # noqa: E501
return sync_detailed(
body=body,
client=client,
).parsed
async def asyncio_detailed(
body: InquiryForm,
*,
client: Client,
) -> Response[Optional[Error]]:
kwargs = _get_kwargs(
body=body,
client=client,
)
async with httpx.AsyncClient(verify=client.verify_ssl) as _client:
response = await _client.put(**kwargs)
return _build_response(response=response)
async def asyncio(
body: InquiryForm,
*,
client: Client,
) -> Optional[Error]:
"""It gets attached to the user's account.""" # noqa: E501
return (
await asyncio_detailed(
body=body,
client=client,
)
).parsed

View File

@ -158,6 +158,10 @@ from kittycad.api.users import (
get_user_shortlinks,
list_users,
list_users_extended,
patch_user_crm,
put_public_form,
put_public_subscribe,
put_user_form_self,
update_user_privacy_settings,
update_user_self,
update_user_shortlink,
@ -239,6 +243,7 @@ from kittycad.models.billing_info import BillingInfo
from kittycad.models.code_language import CodeLanguage
from kittycad.models.create_shortlink_request import CreateShortlinkRequest
from kittycad.models.created_at_sort_mode import CreatedAtSortMode
from kittycad.models.crm_data import CrmData
from kittycad.models.email_authentication_form import EmailAuthenticationForm
from kittycad.models.enterprise_subscription_tier_price import (
EnterpriseSubscriptionTierPrice,
@ -251,6 +256,8 @@ from kittycad.models.idp_metadata_source import (
IdpMetadataSource,
OptionBase64EncodedXml,
)
from kittycad.models.inquiry_form import InquiryForm
from kittycad.models.inquiry_type import InquiryType
from kittycad.models.kcl_code_completion_params import KclCodeCompletionParams
from kittycad.models.kcl_code_completion_request import KclCodeCompletionRequest
from kittycad.models.ml_feedback import MlFeedback
@ -274,6 +281,7 @@ from kittycad.models.source_position import SourcePosition
from kittycad.models.source_range import SourceRange
from kittycad.models.source_range_prompt import SourceRangePrompt
from kittycad.models.store_coupon_params import StoreCouponParams
from kittycad.models.subscribe import Subscribe
from kittycad.models.text_to_cad_create_body import TextToCadCreateBody
from kittycad.models.text_to_cad_iteration_body import TextToCadIterationBody
from kittycad.models.text_to_cad_multi_file_iteration_body import (
@ -5731,6 +5739,49 @@ async def test_delete_api_token_for_user_async():
)
@pytest.mark.skip
def test_patch_user_crm():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = patch_user_crm.sync(
client=client,
body=CrmData(),
)
if isinstance(result, Error) or result is None:
print(result)
raise Exception("Error in response")
body: Error = result
print(body)
# OR if you need more info (e.g. status_code)
response: Response[Optional[Error]] = patch_user_crm.sync_detailed(
client=client,
body=CrmData(),
)
# OR run async
@pytest.mark.asyncio
@pytest.mark.skip
async def test_patch_user_crm_async():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = await patch_user_crm.asyncio(
client=client,
body=CrmData(),
)
# OR run async with more info
response: Response[Optional[Error]] = await patch_user_crm.asyncio_detailed(
client=client,
body=CrmData(),
)
@pytest.mark.skip
def test_get_user_self_extended():
# Create our client.
@ -5774,6 +5825,73 @@ async def test_get_user_self_extended_async():
)
@pytest.mark.skip
def test_put_user_form_self():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = put_user_form_self.sync(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
if isinstance(result, Error) or result is None:
print(result)
raise Exception("Error in response")
body: Error = result
print(body)
# OR if you need more info (e.g. status_code)
response: Response[Optional[Error]] = put_user_form_self.sync_detailed(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
# OR run async
@pytest.mark.asyncio
@pytest.mark.skip
async def test_put_user_form_self_async():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = await put_user_form_self.asyncio(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
# OR run async with more info
response: Response[Optional[Error]] = await put_user_form_self.asyncio_detailed(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
@pytest.mark.skip
def test_get_oauth2_providers_for_user():
# Create our client.
@ -7510,6 +7628,124 @@ async def test_update_payment_balance_for_any_user_async():
)
@pytest.mark.skip
def test_put_public_form():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = put_public_form.sync(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
if isinstance(result, Error) or result is None:
print(result)
raise Exception("Error in response")
body: Error = result
print(body)
# OR if you need more info (e.g. status_code)
response: Response[Optional[Error]] = put_public_form.sync_detailed(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
# OR run async
@pytest.mark.asyncio
@pytest.mark.skip
async def test_put_public_form_async():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = await put_public_form.asyncio(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
# OR run async with more info
response: Response[Optional[Error]] = await put_public_form.asyncio_detailed(
client=client,
body=InquiryForm(
email="<string>",
first_name="<string>",
inquiry_type=InquiryType.GENERAL_INQUIRY,
last_name="<string>",
message="<string>",
),
)
@pytest.mark.skip
def test_put_public_subscribe():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = put_public_subscribe.sync(
client=client,
body=Subscribe(
email="<string>",
),
)
if isinstance(result, Error) or result is None:
print(result)
raise Exception("Error in response")
body: Error = result
print(body)
# OR if you need more info (e.g. status_code)
response: Response[Optional[Error]] = put_public_subscribe.sync_detailed(
client=client,
body=Subscribe(
email="<string>",
),
)
# OR run async
@pytest.mark.asyncio
@pytest.mark.skip
async def test_put_public_subscribe_async():
# Create our client.
client = ClientFromEnv()
result: Optional[Error] = await put_public_subscribe.asyncio(
client=client,
body=Subscribe(
email="<string>",
),
)
# OR run async with more info
response: Response[Optional[Error]] = await put_public_subscribe.asyncio_detailed(
client=client,
body=Subscribe(
email="<string>",
),
)
@pytest.mark.skip
def test_create_executor_term():
# Create our client.

View File

@ -60,6 +60,7 @@ from .coupon import Coupon
from .create_shortlink_request import CreateShortlinkRequest
from .create_shortlink_response import CreateShortlinkResponse
from .created_at_sort_mode import CreatedAtSortMode
from .crm_data import CrmData
from .currency import Currency
from .curve_get_control_points import CurveGetControlPoints
from .curve_get_end_points import CurveGetEndPoints
@ -168,6 +169,8 @@ from .import_file import ImportFile
from .import_files import ImportFiles
from .imported_geometry import ImportedGeometry
from .input_format3d import InputFormat3d
from .inquiry_form import InquiryForm
from .inquiry_type import InquiryType
from .invoice import Invoice
from .invoice_line_item import InvoiceLineItem
from .invoice_status import InvoiceStatus
@ -319,6 +322,7 @@ from .source_range_prompt import SourceRangePrompt
from .start_path import StartPath
from .stl_storage import StlStorage
from .store_coupon_params import StoreCouponParams
from .subscribe import Subscribe
from .subscription_tier_feature import SubscriptionTierFeature
from .subscription_tier_price import SubscriptionTierPrice
from .subscription_tier_type import SubscriptionTierType

View File

@ -0,0 +1,15 @@
from typing import Optional
from pydantic import BaseModel, ConfigDict
class CrmData(BaseModel):
"""The data for subscribing a user to the newsletter."""
cad_industry: Optional[str] = None
cad_user_count: Optional[str] = None
cad_user_type: Optional[str] = None
model_config = ConfigDict(protected_namespaces=())

View File

@ -6,7 +6,7 @@ class Environment(str, Enum):
"""# The development environment. This is for running locally. """ # noqa: E501
DEVELOPMENT = "DEVELOPMENT"
"""# The preview environment. This is when PRs are created and a service is deployed for testing. """ # noqa: E501
"""# The preview environment. This is deployed to api.dev.zoo.dev. """ # noqa: E501
PREVIEW = "PREVIEW"
"""# The production environment. """ # noqa: E501
PRODUCTION = "PRODUCTION"

View File

@ -38,6 +38,8 @@ class ExtendedUser(BaseModel):
image: str
is_onboarded: bool = False
is_service_account: bool = False
last_name: Optional[str] = None

View File

@ -0,0 +1,27 @@
from typing import Optional
from pydantic import BaseModel, ConfigDict
from ..models.inquiry_type import InquiryType
class InquiryForm(BaseModel):
"""The form for a public inquiry submission."""
company: Optional[str] = None
email: str
first_name: str
industry: Optional[str] = None
inquiry_type: InquiryType
last_name: str
message: str
phone: Optional[str] = None
model_config = ConfigDict(protected_namespaces=())

View File

@ -0,0 +1,25 @@
from enum import Enum
class InquiryType(str, Enum):
"""The type of inquiry.""" # noqa: E501
"""# General inquiry about the service or product. """ # noqa: E501
GENERAL_INQUIRY = "general_inquiry"
"""# Questions related to sales or purchasing. """ # noqa: E501
SALES_QUESTION = "sales_question"
"""# Inquiry from a developer, typically technical in nature. """ # noqa: E501
DEVELOPER_INQUIRY = "developer_inquiry"
"""# Opportunity for partnership or collaboration. """ # noqa: E501
PARTNERSHIP_OPPORTUNITY = "partnership_opportunity"
"""# Other inquiries related to sales that do not fit predefined categories. """ # noqa: E501
OTHER_SALES_INQUIRY = "other_sales_inquiry"
"""# Request for technical support or troubleshooting. """ # noqa: E501
TECHNICAL_SUPPORT = "technical_support"
"""# Questions or requests related to account management. """ # noqa: E501
ACCOUNT_MANAGEMENT = "account_management"
"""# Other support-related inquiries that do not fit predefined categories. """ # noqa: E501
OTHER_SUPPORT_INQUIRY = "other_support_inquiry"
def __str__(self) -> str:
return str(self.value)

View File

@ -0,0 +1,9 @@
from pydantic import BaseModel, ConfigDict
class Subscribe(BaseModel):
"""The data for subscribing a user to the newsletter."""
email: str
model_config = ConfigDict(protected_namespaces=())

View File

@ -16,6 +16,8 @@ class UpdateUser(BaseModel):
image: str
is_onboarded: Optional[bool] = None
last_name: Optional[str] = None
phone: str = ""

View File

@ -34,6 +34,8 @@ class User(BaseModel):
image: str
is_onboarded: bool = False
is_service_account: bool = False
last_name: Optional[str] = None

770
spec.json
View File

@ -12675,6 +12675,156 @@
}
}
},
"/user/crm": {
"options": {
"tags": [
"hidden"
],
"summary": "OPTIONS endpoint.",
"description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.",
"operationId": "options_patch_user_crm",
"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"
}
},
"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"
}
}
},
"patch": {
"tags": [
"users",
"hidden"
],
"summary": "Update properties in the CRM",
"operationId": "patch_user_crm",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CrmData"
}
}
},
"required": true
},
"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"
}
},
"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"
}
}
}
},
"/user/extended": {
"get": {
"tags": [
@ -12753,6 +12903,157 @@
}
}
},
"/user/form": {
"put": {
"tags": [
"users",
"hidden"
],
"summary": "Create a new support/sales ticket from the website contact form. This endpoint is authenticated.",
"description": "It gets attached to the user's account.",
"operationId": "put_user_form_self",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InquiryForm"
}
}
},
"required": true
},
"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"
}
},
"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"
}
}
},
"options": {
"tags": [
"hidden"
],
"summary": "OPTIONS endpoint.",
"description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.",
"operationId": "options_put_user_form_self",
"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"
}
},
"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"
}
}
}
},
"/user/oauth2/providers": {
"get": {
"tags": [
@ -16446,6 +16747,307 @@
}
}
},
"/website/form": {
"put": {
"tags": [
"users",
"hidden"
],
"summary": "Creates a new support/sales ticket from the website contact form. This endpoint is for untrusted",
"description": "users and is not authenticated.",
"operationId": "put_public_form",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InquiryForm"
}
}
},
"required": true
},
"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"
}
},
"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"
}
}
},
"options": {
"tags": [
"hidden"
],
"summary": "OPTIONS endpoint.",
"description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.",
"operationId": "options_put_public_form",
"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"
}
},
"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"
}
}
}
},
"/website/subscribe": {
"put": {
"tags": [
"users",
"hidden"
],
"summary": "Subscribes a user to the newsletter.",
"operationId": "put_public_subscribe",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Subscribe"
}
}
},
"required": true
},
"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"
}
},
"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"
}
}
},
"options": {
"tags": [
"hidden"
],
"summary": "OPTIONS endpoint.",
"description": "This is necessary for some preflight requests, specifically POST, PUT, and DELETE.",
"operationId": "options_put_public_subscribe",
"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"
}
},
"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"
}
}
}
},
"/ws/executor/term": {
"get": {
"tags": [
@ -19763,6 +20365,27 @@
}
]
},
"CrmData": {
"description": "The data for subscribing a user to the newsletter.",
"type": "object",
"properties": {
"cad_industry": {
"nullable": true,
"description": "The industry of the user.",
"type": "string"
},
"cad_user_count": {
"nullable": true,
"description": "The user count of the user.",
"type": "string"
},
"cad_user_type": {
"nullable": true,
"description": "The user type.",
"type": "string"
}
}
},
"Currency": {
"description": "Currency is the list of supported currencies. Always lowercase.\n\nThis comes from the Stripe API docs: For more details see <https://support.stripe.com/questions/which-currencies-does-stripe-support>.",
"type": "string"
@ -20763,7 +21386,7 @@
]
},
{
"description": "The preview environment. This is when PRs are created and a service is deployed for testing.",
"description": "The preview environment. This is deployed to api.dev.zoo.dev.",
"type": "string",
"enum": [
"PREVIEW"
@ -21094,6 +21717,11 @@
"type": "string",
"format": "uri"
},
"is_onboarded": {
"description": "If the user has finished onboarding.",
"default": false,
"type": "boolean"
},
"is_service_account": {
"description": "If the user is tied to a service account.",
"default": false,
@ -22707,6 +23335,120 @@
}
]
},
"InquiryForm": {
"description": "The form for a public inquiry submission.",
"type": "object",
"properties": {
"company": {
"nullable": true,
"description": "The company name.",
"type": "string"
},
"email": {
"description": "The email address of the user.",
"type": "string",
"format": "email"
},
"first_name": {
"description": "The first name of the user.",
"type": "string"
},
"industry": {
"nullable": true,
"description": "The industry of the user.",
"type": "string"
},
"inquiry_type": {
"description": "The type of inquiry.",
"allOf": [
{
"$ref": "#/components/schemas/InquiryType"
}
]
},
"last_name": {
"description": "The last name of the user.",
"type": "string"
},
"message": {
"description": "The message content.",
"type": "string"
},
"phone": {
"nullable": true,
"description": "The phone number of the user.",
"type": "string"
}
},
"required": [
"email",
"first_name",
"inquiry_type",
"last_name",
"message"
]
},
"InquiryType": {
"description": "The type of inquiry.",
"oneOf": [
{
"description": "General inquiry about the service or product.",
"type": "string",
"enum": [
"general_inquiry"
]
},
{
"description": "Questions related to sales or purchasing.",
"type": "string",
"enum": [
"sales_question"
]
},
{
"description": "Inquiry from a developer, typically technical in nature.",
"type": "string",
"enum": [
"developer_inquiry"
]
},
{
"description": "Opportunity for partnership or collaboration.",
"type": "string",
"enum": [
"partnership_opportunity"
]
},
{
"description": "Other inquiries related to sales that do not fit predefined categories.",
"type": "string",
"enum": [
"other_sales_inquiry"
]
},
{
"description": "Request for technical support or troubleshooting.",
"type": "string",
"enum": [
"technical_support"
]
},
{
"description": "Questions or requests related to account management.",
"type": "string",
"enum": [
"account_management"
]
},
{
"description": "Other support-related inquiries that do not fit predefined categories.",
"type": "string",
"enum": [
"other_support_inquiry"
]
}
]
},
"Invoice": {
"description": "An invoice.",
"type": "object",
@ -33355,6 +34097,20 @@
"percent_off"
]
},
"Subscribe": {
"description": "The data for subscribing a user to the newsletter.",
"type": "object",
"properties": {
"email": {
"description": "The email",
"type": "string",
"format": "email"
}
},
"required": [
"email"
]
},
"SubscriptionTierFeature": {
"description": "A subscription tier feature.",
"type": "object",
@ -36187,6 +36943,11 @@
"type": "string",
"format": "uri"
},
"is_onboarded": {
"nullable": true,
"description": "If the user is now onboarded.",
"type": "boolean"
},
"last_name": {
"description": "The user's last name.",
"type": "string"
@ -36232,7 +36993,7 @@
"format": "date-time"
},
"deletion_scheduled": {
"description": "If the user is scheduled for deletion",
"description": "If the user is scheduled for deletion.",
"default": false,
"type": "boolean"
},
@ -36274,6 +37035,11 @@
"type": "string",
"format": "uri"
},
"is_onboarded": {
"description": "If the user has finished onboarding.",
"default": false,
"type": "boolean"
},
"is_service_account": {
"description": "If the user is tied to a service account.",
"default": false,