openapi: 3.1.0 info: title: Vistra Incorporations Documents API description: 'The Vistra Incorporations API enables programmatic submission of company incorporation requests in supported jurisdictions. Currently available for the British Virgin Islands (BVI) on an invite-only basis. The API supports a three-step workflow: (1) generate a pre-signed S3 document upload URL, (2) confirm document upload completion, and (3) submit the full incorporation request with entity details, stakeholders, shareholding structure, and compliance data. Authentication uses OAuth2 bearer tokens obtained from the Vistra Developer Portal.' version: '1.0' contact: name: Vistra Developer Support url: https://devportal.vistra.com/ license: name: Vistra Terms of Use url: https://www.vistra.com/terms-of-use termsOfService: https://www.vistra.com/terms-of-use servers: - url: https://api.vistra.com description: Vistra Production API security: - OAuth2Bearer: [] tags: - name: Documents description: Document upload URL generation and completion notification paths: /v1/external/documents/upload-url: post: operationId: generateDocumentUploadUrl summary: Generate Document Upload URL description: Generates a pre-signed S3 URL for uploading a supporting document for an incorporation request. The response includes a document ID and an upload URL that is valid for one minute. Upload the file directly to the pre-signed URL using an HTTP PUT request, then call the upload-complete endpoint with the document ID to notify Vistra the upload has finished. tags: - Documents requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DocumentUploadRequest' responses: '200': description: Pre-signed upload URL and document ID content: application/json: schema: $ref: '#/components/schemas/DocumentUploadResponse' '400': description: Invalid request parameters content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized - Invalid or missing bearer token content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/Error' /v1/external/documents/{id}/upload-complete: post: operationId: completeDocumentUpload summary: Complete Document Upload description: Notifies Vistra that a document upload to the pre-signed S3 URL has completed successfully. This endpoint must be called after the file has been uploaded directly to the pre-signed URL. The response confirms the document ID and returns file metadata including filename and size. The document ID is then used when submitting the incorporation request. tags: - Documents parameters: - name: id in: path required: true description: The document ID returned by the generate-upload-url endpoint schema: type: string responses: '200': description: Document upload confirmed with file details content: application/json: schema: $ref: '#/components/schemas/DocumentUploadCompleteResponse' '400': description: Invalid document ID or upload not yet completed content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Document ID not found content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Internal server error content: application/json: schema: $ref: '#/components/schemas/Error' components: schemas: DocumentUploadCompleteResponse: type: object description: Confirmation that a document upload has been registered properties: documentId: type: string description: Document identifier filename: type: string description: Uploaded filename size: type: integer description: File size in bytes status: type: string description: Upload status enum: - completed - pending - failed DocumentUploadResponse: type: object description: Pre-signed S3 URL and document ID for uploading a document properties: documentId: type: string description: Unique identifier for this document, used in subsequent calls uploadUrl: type: string description: Pre-signed S3 URL for HTTP PUT file upload (valid for 1 minute) expiresAt: type: string format: date-time description: Expiry timestamp of the upload URL DocumentUploadRequest: type: object description: Request to generate a pre-signed document upload URL required: - filename - contentType properties: filename: type: string description: Name of the file to upload example: passport-john-doe.pdf contentType: type: string description: MIME type of the file example: application/pdf description: type: string description: Optional description of the document Error: type: object description: API error response properties: code: type: string description: Error code message: type: string description: Human-readable error message details: type: string description: Additional error details securitySchemes: OAuth2Bearer: type: http scheme: bearer description: OAuth2 bearer token obtained from the Vistra Developer Portal. Include in the Authorization header as "Bearer {token}". externalDocs: description: Vistra Incorporations API Documentation url: https://help.vistra.com/en/articles/10351085-vistra-incorporations-api-british-virgin-islands