{"openapi":"3.1.0","info":{"title":"GST Cranes — Companies API","version":"0.1.0","description":"Public API documentation for GST Cranes company and fleet-record discovery, plus browser-session webhook endpoint management. Public read endpoints require no API key; account-owned webhook writes require normal GST Cranes sign-in. Clients may send GST-API-Version: 2026-07-06 to pin integration expectations. Deprecation policy: breaking changes are announced in developer docs and, where applicable, with Deprecation and Sunset response headers before removal.","x-developerResources":{"canonical":"https://gstcranes.com/developer-resources","apiDocumentation":"https://gstcranes.com/developers","markdown":"https://gstcranes.com/developer-resources.md","apiDocumentationMarkdown":"https://gstcranes.com/developers.md"}},"externalDocs":{"description":"GST Cranes API deprecation and versioning policy","url":"https://gstcranes.com/docs/api/deprecation-policy"},"servers":[{"url":"https://gstcranes.com","description":"Production"}],"paths":{"/api/companies":{"get":{"operationId":"listCompanies","summary":"List companies","parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"country","in":"query","schema":{"type":"string","minLength":2,"maxLength":2}},{"name":"service_type","in":"query","schema":{"type":"string","enum":["mobile_crane","crawler_crane","aerial_platform","heavy_haulage"]}},{"name":"capacity_min_t","in":"query","schema":{"type":"number"}},{"name":"bbox","in":"query","schema":{"type":"string","description":"minLon,minLat,maxLon,maxLat"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500}}],"responses":{"200":{"description":"List of public companies","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyList"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/companies/{slug}":{"get":{"operationId":"getCompanyBySlug","summary":"Get a company by slug","parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Company detail","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCompany"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/companies/batch":{"post":{"operationId":"batchGetCompaniesBySlug","summary":"Batch get companies by slug","description":"Read-only batch lookup for public company records. Accepts up to 50 slugs and returns active public companies in request order.","parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCompanyRequest"}}}},"responses":{"200":{"description":"Batch public company lookup result","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCompanyResponse"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/sandbox/first-call":{"get":{"operationId":"getSandboxFirstCall","summary":"Run the zero-auth sandbox first API call","description":"Read-only sandbox environment for agents to make a first API call without an API key, account session, credit spend, or data mutation.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Sandbox first-call response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxFirstCall"},"examples":{"readOnlyFirstCall":{"summary":"Read-only sandbox first API call","value":{"ok":true,"mode":"sandbox","auth":"none","side_effects":false,"read_only":true,"mutates":[],"writes":false,"message":"GST Cranes read-only sandbox first API call. No API key is required and no account data is accessed.","sample_curl":"curl https://gstcranes.com/api/sandbox/first-call","next":{"developer_resources":"https://gstcranes.com/developer-resources","developers":"https://gstcranes.com/developers","developer_resources_markdown":"https://gstcranes.com/developer-resources.md","auth":"https://gstcranes.com/auth.md","openapi":"https://gstcranes.com/.well-known/openapi.json","companies":"https://gstcranes.com/api/companies?country=DE&limit=10"}}}}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/webhooks/endpoints":{"get":{"operationId":"listWebhookEndpoints","summary":"List signed-in member webhook endpoints","description":"Browser-session account endpoint. Returns webhook endpoints owned by the signed-in member without exposing signing secrets.","security":[{"browserSession":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Webhook endpoints for the signed-in member.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointList"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Browser session required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access forbidden or account action required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Required backend service is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createWebhookEndpoint","summary":"Create a webhook endpoint","description":"Browser-session account endpoint. Registers an HTTPS webhook endpoint and returns the HMAC signing secret once.","security":[{"browserSession":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreateRequest"}}}},"responses":{"200":{"description":"Webhook endpoint created. The signing secret is returned once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreateResponse"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Browser session required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access forbidden or account action required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Request conflicts with the current resource state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Required backend service is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/webhooks/endpoints/{id}":{"delete":{"operationId":"deleteWebhookEndpoint","summary":"Disable a webhook endpoint","description":"Browser-session account endpoint. Disables an active webhook endpoint owned by the signed-in member.","security":[{"browserSession":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Webhook endpoint disabled.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"description":"Browser session required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access forbidden or account action required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Required backend service is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/webhooks/test":{"post":{"operationId":"sendWebhookTest","summary":"Send a signed webhook test delivery","description":"Browser-session account endpoint. Sends a signed webhook.test payload to one active endpoint owned by the signed-in member.","security":[{"browserSession":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestRequest"}}}},"responses":{"200":{"description":"Webhook test delivery result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResponse"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Browser session required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access forbidden or account action required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Required backend service is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/listings/{id}/brochure/openai-generate":{"post":{"operationId":"startOpenAiBrochureGeneration","summary":"Start OpenAI brochure generation","description":"Browser-session admin workflow for brochure image generation. Send mode=async to start a background job; the response is HTTP 202 with a Location header that clients can poll through openai-status.","security":[{"browserSession":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"$ref":"#/components/parameters/IdempotencyKey"},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Listing id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncBrochureGenerateRequest"}}}},"responses":{"200":{"description":"Synchronous brochure generation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncBrochureSyncResult"}}}},"202":{"description":"Async brochure generation job accepted.","headers":{"Location":{"description":"Poll this relative URL for async brochure generation status.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncBrochureJob"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Browser session required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access forbidden or account action required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Required backend service is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/listings/{id}/brochure/openai-status":{"get":{"operationId":"getOpenAiBrochureGenerationStatus","summary":"Get OpenAI brochure generation status","description":"Polls per-style OpenAI brochure generation results for a listing after an async generation request.","security":[{"browserSession":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Listing id."},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Unix timestamp returned by the async start response."}],"responses":{"200":{"description":"Current async brochure generation status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncBrochureJobStatus"}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Browser session required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access forbidden or account action required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Required backend service is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/ask":{"post":{"operationId":"askPublicResourceRouter","summary":"Ask the public GST Cranes resource router","description":"Read-only natural-language resource routing for public marketplace, wanted-ad, Crane Wiki, and developer resources. This endpoint has no side effects; clients may still send Idempotency-Key for replay-safe agent integrations.","parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}}},"responses":{"200":{"description":"Public resource-routing answer","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskResponse"}},"text/event-stream":{"schema":{"type":"string"},"examples":{"message":{"value":"event: message\\ndata: {\"answer\":{\"text\":\"GST Cranes can help...\"}}\\n\\nevent: done\\ndata: {\"ok\":true}\\n\\n"}}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/api-catalog":{"get":{"operationId":"getApiCatalog","summary":"Get the GST Cranes API catalog","description":"Public read-only discovery resource for agents and crawlers. This endpoint has no side effects and requires no API key.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Get the GST Cranes API catalog","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/ai-catalog.json":{"get":{"operationId":"getAiCatalog","summary":"Get the GST Cranes AI catalog","description":"Public read-only discovery resource for agents and crawlers. This endpoint has no side effects and requires no API key.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Get the GST Cranes AI catalog","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/http-message-signatures-directory":{"get":{"operationId":"getHttpMessageSignaturesDirectory","summary":"Get the GST Cranes HTTP Message Signatures directory","description":"Public read-only Web Bot Auth discovery resource. This endpoint publishes HTTP Message Signatures verification keys when GST Cranes has active outbound signers; it currently returns a future-not-before reserved public key with an expiry timestamp, without private key material or active outbound signing claims.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"GST Cranes HTTP Message Signatures directory.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/http-message-signatures-directory+json":{"schema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"type":"object"},"description":"Public HTTP Message Signatures verification keys. GST Cranes currently publishes a future-not-before reserved public key with an expiry timestamp and no active outbound signer."},"_meta":{"type":"object","additionalProperties":true}}}},"application/json":{"schema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"type":"object"},"description":"Public HTTP Message Signatures verification keys. GST Cranes currently publishes a future-not-before reserved public key with an expiry timestamp and no active outbound signer."},"_meta":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/webhooks":{"get":{"operationId":"getWebhookProfile","summary":"Get the GST Cranes webhook profile","description":"Public read-only discovery resource for agents and crawlers. This endpoint has no side effects and requires no API key.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Get the GST Cranes webhook profile","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"operationId":"getMcpServerCard","summary":"Get the GST Cranes MCP server card","description":"Public read-only discovery resource for agents and crawlers. This endpoint has no side effects and requires no API key.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Get the GST Cranes MCP server card","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/mcp/server-card.json":{"get":{"operationId":"getShortProductMcpServerCard","summary":"Get the GST Cranes short product MCP server card","description":"Public read-only discovery resource for agents and crawlers. This endpoint has no side effects and requires no API key.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Get the GST Cranes short product MCP server card","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/docs/mcp/server-card.json":{"get":{"operationId":"getMcpDocsCanonicalServerCard","summary":"Get the GST Cranes public docs MCP canonical server card","description":"Public read-only discovery resource for agents and crawlers. This endpoint has no side effects and requires no API key.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Get the GST Cranes public docs MCP canonical server card","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/mcp/docs/server-card.json":{"get":{"operationId":"getMcpDocsServerCard","summary":"Get the GST Cranes public docs MCP server card","description":"Public read-only discovery resource for agents and crawlers. This endpoint has no side effects and requires no API key.","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Get the GST Cranes public docs MCP server card","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"webhooks":{"webhook.test":{"post":{"operationId":"receiveWebhookTestWebhook","summary":"Receive a signed GST Cranes webhook.test delivery","description":"Outbound GST Cranes webhook delivery. Consumers must verify the branded GST-Webhook-Signature HMAC-SHA256 header before processing the JSON payload.","parameters":[{"name":"GST-Webhook-Id","in":"header","required":true,"schema":{"type":"string","example":"wh_123"},"description":"Unique GST Cranes webhook delivery id."},{"name":"GST-Webhook-Event","in":"header","required":true,"schema":{"$ref":"#/components/schemas/WebhookEvent"},"description":"GST Cranes webhook event type for this delivery."},{"name":"GST-Webhook-Timestamp","in":"header","required":true,"schema":{"type":"integer","example":1780000000},"description":"Unix timestamp included in the webhook signature input."},{"name":"GST-Webhook-Signature","in":"header","required":true,"schema":{"type":"string","pattern":"^v1=[a-f0-9]{64}$","example":"v1=abcdef..."},"description":"Branded GST Cranes HMAC-SHA256 signature header. Verify this GST-Webhook-Signature value against GST-Webhook-Timestamp + \".\" + raw_body using the endpoint secret, reject timestamps outside the 300-second timestamp tolerance, and compare digests with a constant-time compare."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookDelivery"},{"type":"object","properties":{"event":{"type":"string","const":"webhook.test"}}}]}}}},"responses":{"200":{"description":"Consumer accepted the signed GST Cranes webhook delivery."},"204":{"description":"Consumer accepted the signed GST Cranes webhook delivery."},"default":{"description":"Any non-2xx response is treated as a failed best-effort delivery and recorded on the webhook endpoint."}}}},"saved_alert.match":{"post":{"operationId":"receiveSavedAlertMatchWebhook","summary":"Receive a signed GST Cranes saved_alert.match delivery","description":"Outbound GST Cranes webhook delivery. Consumers must verify the branded GST-Webhook-Signature HMAC-SHA256 header before processing the JSON payload.","parameters":[{"name":"GST-Webhook-Id","in":"header","required":true,"schema":{"type":"string","example":"wh_123"},"description":"Unique GST Cranes webhook delivery id."},{"name":"GST-Webhook-Event","in":"header","required":true,"schema":{"$ref":"#/components/schemas/WebhookEvent"},"description":"GST Cranes webhook event type for this delivery."},{"name":"GST-Webhook-Timestamp","in":"header","required":true,"schema":{"type":"integer","example":1780000000},"description":"Unix timestamp included in the webhook signature input."},{"name":"GST-Webhook-Signature","in":"header","required":true,"schema":{"type":"string","pattern":"^v1=[a-f0-9]{64}$","example":"v1=abcdef..."},"description":"Branded GST Cranes HMAC-SHA256 signature header. Verify this GST-Webhook-Signature value against GST-Webhook-Timestamp + \".\" + raw_body using the endpoint secret, reject timestamps outside the 300-second timestamp tolerance, and compare digests with a constant-time compare."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookDelivery"},{"type":"object","properties":{"event":{"type":"string","const":"saved_alert.match"}}}]}}}},"responses":{"200":{"description":"Consumer accepted the signed GST Cranes webhook delivery."},"204":{"description":"Consumer accepted the signed GST Cranes webhook delivery."},"default":{"description":"Any non-2xx response is treated as a failed best-effort delivery and recorded on the webhook endpoint."}}}}},"components":{"securitySchemes":{"browserSession":{"type":"apiKey","in":"cookie","name":"auth_session","description":"Normal GST Cranes browser sign-in session. Public read endpoints do not require this; webhook endpoint management does."}},"parameters":{"ApiVersion":{"name":"GST-API-Version","in":"header","required":false,"schema":{"type":"string","example":"2026-07-06"},"description":"Optional version pin. Omit for the current public API contract, or send 2026-07-06 for explicit agent integrations."},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":8,"maxLength":128},"description":"Optional replay-safety key for agent clients. Public read endpoints have no side effects; write endpoints that spend credits or publish content remain browser-session workflows."}},"headers":{"RateLimitLimit":{"description":"Maximum request count in the current rate-limit window.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Remaining request count in the current rate-limit window.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Unix timestamp when the current rate-limit window resets.","schema":{"type":"integer"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"Deprecation":{"description":"RFC 9745 Deprecation signal. Present only when an API version or behavior is being deprecated.","schema":{"type":"string"}},"Sunset":{"description":"RFC 8594 Sunset signal. Present only when a deprecated API version has a planned removal date.","schema":{"type":"string","format":"date-time"}},"GSTWebhookId":{"description":"GST Cranes webhook delivery id header, sent as GST-Webhook-Id.","schema":{"type":"string"}},"GSTWebhookEvent":{"description":"GST Cranes webhook event header, sent as GST-Webhook-Event.","schema":{"$ref":"#/components/schemas/WebhookEvent"}},"GSTWebhookTimestamp":{"description":"GST Cranes webhook timestamp header, sent as GST-Webhook-Timestamp and included in the signature input.","schema":{"type":"integer"}},"GSTWebhookSignature":{"description":"Branded GST Cranes webhook signature header, sent as GST-Webhook-Signature. Verify this HMAC-SHA256 value over GST-Webhook-Timestamp + \".\" + raw body with a 300-second timestamp tolerance, constant-time compare, and GST-Webhook-Id replay protection before processing the delivery.","schema":{"type":"string","pattern":"^v1=[a-f0-9]{64}$"}}},"responses":{"BadRequest":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Forbidden":{"description":"Access forbidden or account action required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"NotFound":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Conflict":{"description":"Request conflicts with the current resource state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"TooManyRequests":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"ServiceUnavailable":{"description":"Required backend service is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"ServerError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"Error":{"description":"Machine-readable API error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"schemas":{"ApiError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_request"},"message":{"type":"string","example":"The request could not be processed."},"resolution":{"type":"string","example":"Check the request parameters and retry with a valid payload."}}}}},"CompanyList":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicCompany"}},"next_cursor":{"type":["string","null"]}}},"BatchCompanyRequest":{"type":"object","required":["slugs"],"properties":{"slugs":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","minLength":1,"maxLength":120}}},"additionalProperties":false},"BatchCompanyResponse":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicCompany"}}}},"SandboxFirstCall":{"type":"object","required":["ok","mode","auth","side_effects","read_only","mutates","writes","message","sample_curl","next"],"properties":{"ok":{"type":"boolean","const":true},"mode":{"type":"string","const":"sandbox"},"auth":{"type":"string","const":"none"},"side_effects":{"type":"boolean","const":false},"read_only":{"type":"boolean","const":true},"mutates":{"type":"array","items":{"type":"string"},"maxItems":0},"writes":{"type":"boolean","const":false},"message":{"type":"string"},"sample_curl":{"type":"string"},"next":{"type":"object","required":["developer_resources","developers","developer_resources_markdown","auth","openapi","companies"],"properties":{"developer_resources":{"type":"string","format":"uri"},"developers":{"type":"string","format":"uri"},"developer_resources_markdown":{"type":"string","format":"uri"},"auth":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"companies":{"type":"string","format":"uri"}}}}},"AsyncBrochureGenerateRequest":{"type":"object","properties":{"mode":{"type":"string","enum":["sync","async"],"description":"Use async to start a background generation job and poll status later."},"style":{"type":"string","enum":["A","B","C","all"],"default":"all"},"quality":{"type":"string","enum":["low","medium","high"],"default":"high"},"size":{"type":"string","enum":["1024x1024","1536x1024","1024x1536"],"default":"1024x1024"},"caller":{"type":"string","maxLength":32}},"additionalProperties":false},"AsyncBrochureJob":{"type":"object","required":["started","job_id","started_at","styles_requested","status_url"],"properties":{"started":{"type":"boolean","const":true},"job_id":{"type":"string","example":"openai-brochure-listing_123-1780000000"},"started_at":{"type":"integer","example":1780000000},"styles_requested":{"type":"array","items":{"type":"string","enum":["A","B","C"]}},"status_url":{"type":"string","example":"/api/listings/listing_123/brochure/openai-status?since=1780000000"}}},"AsyncBrochureResult":{"type":"object","required":["style"],"properties":{"style":{"type":"string","enum":["A","B","C"]},"status":{"type":"string","enum":["ok","error"]},"url":{"type":["string","null"]},"email_html":{"type":["string","null"]},"cost_estimate_usd":{"type":["number","null"]},"error":{"type":["string","null"]},"created_at":{"type":["integer","null"]}}},"AsyncBrochureSyncResult":{"type":"object","required":["listing_id","styles","results","total_cost_estimate_usd"],"properties":{"listing_id":{"type":"string"},"styles":{"type":"array","items":{"type":"string","enum":["A","B","C"]}},"results":{"type":"array","items":{"$ref":"#/components/schemas/AsyncBrochureResult"}},"total_cost_estimate_usd":{"type":"number"}}},"AsyncBrochureJobStatus":{"type":"object","required":["listing_id","since","results"],"properties":{"listing_id":{"type":"string"},"since":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AsyncBrochureResult"}}}},"WebhookEvent":{"type":"string","enum":["webhook.test","saved_alert.match"]},"WebhookDelivery":{"type":"object","required":["id","event","created","data"],"properties":{"id":{"type":"string","example":"wh_123"},"event":{"$ref":"#/components/schemas/WebhookEvent"},"created":{"type":"integer","example":1780000000},"data":{"type":"object","additionalProperties":true}},"additionalProperties":true},"WebhookEndpointCreateRequest":{"type":"object","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","example":"https://example.com/gst-webhook"},"events":{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/WebhookEvent"}}},"additionalProperties":false},"WebhookEndpoint":{"type":"object","required":["id","url","events","status","created_at","updated_at"],"properties":{"id":{"type":"string","example":"we_abc123"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEvent"}},"status":{"type":"string","enum":["active","disabled"]},"created_at":{"type":"integer"},"updated_at":{"type":"integer"},"last_delivery_at":{"type":["integer","null"]},"last_status":{"type":["integer","null"]},"last_error":{"type":["string","null"]}}},"WebhookEndpointList":{"type":"object","required":["endpoints"],"properties":{"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"WebhookEndpointCreateResponse":{"allOf":[{"$ref":"#/components/schemas/WebhookEndpoint"}],"properties":{"secret":{"type":"string","description":"HMAC signing secret. Returned only when the endpoint is created.","example":"whsec_abc123"}}},"WebhookTestRequest":{"type":"object","required":["endpoint_id"],"properties":{"endpoint_id":{"type":"string","example":"we_abc123"}},"additionalProperties":false},"WebhookTestResponse":{"type":"object","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":["integer","null"]},"error":{"type":["string","null"]}}},"PublicCompany":{"type":"object","required":["id","slug","name","country","lat","lon","services","fleet_highlights"],"properties":{"id":{"type":"integer"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"logo_url":{"type":["string","null"]},"cover_image_url":{"type":["string","null"]},"website":{"type":["string","null"]},"phone":{"type":["string","null"]},"whatsapp":{"type":["string","null"]},"address_line1":{"type":["string","null"]},"address_line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state_region":{"type":["string","null"]},"country":{"type":"string"},"postal_code":{"type":["string","null"]},"lat":{"type":"number"},"lon":{"type":"number"},"tier":{"type":"string","enum":["free","featured"]},"services":{"type":"array","items":{"type":"string"}},"fleet_highlights":{"type":"array","items":{"$ref":"#/components/schemas/FleetHighlight"}}}},"FleetHighlight":{"type":"object","properties":{"brand":{"type":["string","null"]},"model":{"type":["string","null"]},"capacity_t":{"type":["number","null"]},"boom_type":{"type":["string","null"]},"max_height_m":{"type":["number","null"]}}},"AskRequest":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language question about public GST Cranes resources."},"q":{"type":"string","description":"Short alias for query."}},"additionalProperties":false},"AskResponse":{"type":"object","required":["_meta","answer","results"],"properties":{"_meta":{"type":"object","properties":{"response_type":{"type":"string","example":"answer"},"response_format":{"type":"string","example":"conversational_search"},"version":{"type":"string","example":"0.1"}}},"answer":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}},"results":{"type":"array","items":{"type":"object","properties":{"@type":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"}}}}}}}}}