# Structured Sheets ## List structured sheets `structured_sheets.list(StructuredSheetListParams**kwargs) -> SyncCursorIDPage[StructuredSheetResponse]` **get** `/v1/structured-sheets` List all structured sheets conversions for the authenticated user. Results are paginated using cursor-based pagination. ### Parameters - `after: Optional[str]` A cursor for pagination. Use the `last_id` from a previous response to fetch the next page of results. - `limit: Optional[int]` Maximum number of results to return per page. ### Returns - `class StructuredSheetResponse: …` Response representing a structured sheet conversion job. This is returned from POST (create), GET (retrieve), and list endpoints. - `id: str` The unique identifier for this structured sheet conversion. - `created_at: datetime` The timestamp when the conversion was started. - `file_id: str` The unique identifier for the source file. - `object: Literal["structured_sheet"]` The object type, which is always 'structured_sheet'. - `"structured_sheet"` - `status: Literal["queued", "in_progress", "completed", 2 more]` The current processing status. - `"queued"` - `"in_progress"` - `"completed"` - `"failed"` - `"cancelled"` - `updated_at: datetime` The timestamp when the conversion was last updated. - `last_error: Optional[LastError]` Error information when processing fails. - `code: str` A machine-readable error code. - `message: str` A human-readable description of the error. - `sheet_names: Optional[List[str]]` List of sheet names included in this conversion. - `table_count: Optional[int]` Number of tables extracted from the workbook. Only present when status is 'completed'. ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) page = client.structured_sheets.list() page = page.data[0] print(page.id) ``` #### Response ```json { "data": [ { "id": "ss_01kfxgjd94fn9stqm42nejb627", "created_at": "2024-01-15T10:30:00Z", "file_id": "file_01kfxgjd94fn9stqm414vjb0s8", "object": "structured_sheet", "status": "completed", "updated_at": "2024-01-15T10:35:00Z", "last_error": { "code": "invalid_file_format", "message": "The uploaded file is not a valid Excel spreadsheet." }, "sheet_names": [ "Sheet1", "Financials" ], "table_count": 6 } ], "has_more": false, "object": "list", "first_id": "ss_01kfxgjd94fn9stqm42nejb627", "last_id": "ss_01kfxgjd94fn9stqm42nejb627" } ``` ## Create structured sheet `structured_sheets.create(StructuredSheetCreateParams**kwargs) -> StructuredSheetResponse` **post** `/v1/structured-sheets` Start converting a spreadsheet workbook into structured data. This initiates an asynchronous conversion process. Poll the returned resource using the `id` to check completion status. ### Parameters - `file_id: str` The unique identifier of the file to convert. - `sheet_names: Optional[SequenceNotStr[str]]` List of sheet names to convert. If None, all sheets will be converted. ### Returns - `class StructuredSheetResponse: …` Response representing a structured sheet conversion job. This is returned from POST (create), GET (retrieve), and list endpoints. - `id: str` The unique identifier for this structured sheet conversion. - `created_at: datetime` The timestamp when the conversion was started. - `file_id: str` The unique identifier for the source file. - `object: Literal["structured_sheet"]` The object type, which is always 'structured_sheet'. - `"structured_sheet"` - `status: Literal["queued", "in_progress", "completed", 2 more]` The current processing status. - `"queued"` - `"in_progress"` - `"completed"` - `"failed"` - `"cancelled"` - `updated_at: datetime` The timestamp when the conversion was last updated. - `last_error: Optional[LastError]` Error information when processing fails. - `code: str` A machine-readable error code. - `message: str` A human-readable description of the error. - `sheet_names: Optional[List[str]]` List of sheet names included in this conversion. - `table_count: Optional[int]` Number of tables extracted from the workbook. Only present when status is 'completed'. ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) structured_sheet_response = client.structured_sheets.create( file_id="file_01h45ytscbebyvny4gc8cr8ma2", ) print(structured_sheet_response.id) ``` #### Response ```json { "id": "ss_01kfxgjd94fn9stqm42nejb627", "created_at": "2024-01-15T10:30:00Z", "file_id": "file_01kfxgjd94fn9stqm414vjb0s8", "object": "structured_sheet", "status": "completed", "updated_at": "2024-01-15T10:35:00Z", "last_error": { "code": "invalid_file_format", "message": "The uploaded file is not a valid Excel spreadsheet." }, "sheet_names": [ "Sheet1", "Financials" ], "table_count": 6 } ``` ## Delete structured sheet `structured_sheets.delete(strstructured_sheet_id) -> StructuredSheetDeleteResponse` **delete** `/v1/structured-sheets/{structured_sheet_id}` Delete a structured sheet conversion and its associated exports. This action cannot be undone. ### Parameters - `structured_sheet_id: str` The unique identifier of the structured sheet conversion. ### Returns - `class StructuredSheetDeleteResponse: …` Response from deleting a structured sheet. Following the OpenAI API convention for delete responses. - `id: str` The unique identifier of the deleted structured sheet. - `deleted: Literal[true]` Whether the structured sheet was successfully deleted. - `true` - `object: Literal["structured_sheet"]` The object type, which is always 'structured_sheet'. - `"structured_sheet"` ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) structured_sheet = client.structured_sheets.delete( "ss_01kfxgjd94fn9stqm42nejb627", ) print(structured_sheet.id) ``` #### Response ```json { "id": "ss_01kfxgjd94fn9stqm42nejb627", "deleted": true, "object": "structured_sheet" } ``` ## Retrieve structured sheet `structured_sheets.retrieve(strstructured_sheet_id) -> StructuredSheetResponse` **get** `/v1/structured-sheets/{structured_sheet_id}` Get the status and details of a structured sheet conversion. ### Parameters - `structured_sheet_id: str` The unique identifier of the structured sheet conversion. ### Returns - `class StructuredSheetResponse: …` Response representing a structured sheet conversion job. This is returned from POST (create), GET (retrieve), and list endpoints. - `id: str` The unique identifier for this structured sheet conversion. - `created_at: datetime` The timestamp when the conversion was started. - `file_id: str` The unique identifier for the source file. - `object: Literal["structured_sheet"]` The object type, which is always 'structured_sheet'. - `"structured_sheet"` - `status: Literal["queued", "in_progress", "completed", 2 more]` The current processing status. - `"queued"` - `"in_progress"` - `"completed"` - `"failed"` - `"cancelled"` - `updated_at: datetime` The timestamp when the conversion was last updated. - `last_error: Optional[LastError]` Error information when processing fails. - `code: str` A machine-readable error code. - `message: str` A human-readable description of the error. - `sheet_names: Optional[List[str]]` List of sheet names included in this conversion. - `table_count: Optional[int]` Number of tables extracted from the workbook. Only present when status is 'completed'. ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) structured_sheet_response = client.structured_sheets.retrieve( "ss_01kfxgjd94fn9stqm42nejb627", ) print(structured_sheet_response.id) ``` #### Response ```json { "id": "ss_01kfxgjd94fn9stqm42nejb627", "created_at": "2024-01-15T10:30:00Z", "file_id": "file_01kfxgjd94fn9stqm414vjb0s8", "object": "structured_sheet", "status": "completed", "updated_at": "2024-01-15T10:35:00Z", "last_error": { "code": "invalid_file_format", "message": "The uploaded file is not a valid Excel spreadsheet." }, "sheet_names": [ "Sheet1", "Financials" ], "table_count": 6 } ``` ## Cancel structured sheet processing `structured_sheets.cancel(strstructured_sheet_id) -> StructuredSheetResponse` **post** `/v1/structured-sheets/{structured_sheet_id}/cancel` Cancel a structured sheet conversion that is in progress. Only jobs with status 'queued' or 'in_progress' can be cancelled. ### Parameters - `structured_sheet_id: str` The unique identifier of the structured sheet conversion. ### Returns - `class StructuredSheetResponse: …` Response representing a structured sheet conversion job. This is returned from POST (create), GET (retrieve), and list endpoints. - `id: str` The unique identifier for this structured sheet conversion. - `created_at: datetime` The timestamp when the conversion was started. - `file_id: str` The unique identifier for the source file. - `object: Literal["structured_sheet"]` The object type, which is always 'structured_sheet'. - `"structured_sheet"` - `status: Literal["queued", "in_progress", "completed", 2 more]` The current processing status. - `"queued"` - `"in_progress"` - `"completed"` - `"failed"` - `"cancelled"` - `updated_at: datetime` The timestamp when the conversion was last updated. - `last_error: Optional[LastError]` Error information when processing fails. - `code: str` A machine-readable error code. - `message: str` A human-readable description of the error. - `sheet_names: Optional[List[str]]` List of sheet names included in this conversion. - `table_count: Optional[int]` Number of tables extracted from the workbook. Only present when status is 'completed'. ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) structured_sheet_response = client.structured_sheets.cancel( "ss_01kfxgjd94fn9stqm42nejb627", ) print(structured_sheet_response.id) ``` #### Response ```json { "id": "ss_01kfxgjd94fn9stqm42nejb627", "created_at": "2024-01-15T10:30:00Z", "file_id": "file_01kfxgjd94fn9stqm414vjb0s8", "object": "structured_sheet", "status": "completed", "updated_at": "2024-01-15T10:35:00Z", "last_error": { "code": "invalid_file_format", "message": "The uploaded file is not a valid Excel spreadsheet." }, "sheet_names": [ "Sheet1", "Financials" ], "table_count": 6 } ``` ## Download structured sheet export `structured_sheets.download(strstructured_sheet_id, StructuredSheetDownloadParams**kwargs) -> BinaryResponseContent` **get** `/v1/structured-sheets/{structured_sheet_id}/download` Download the structured data in the specified format. Only available when conversion status is 'completed'. Available formats: - `sqlite`: SQLite database containing all extracted tables - `cell_labels`: CSV file with cell-level semantic labels ### Parameters - `structured_sheet_id: str` The unique identifier of the structured sheet conversion. - `format: Optional[Literal["sqlite", "cell_labels"]]` The export format to download. - `"sqlite"` - `"cell_labels"` ### Returns - `BinaryResponseContent` ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) response = client.structured_sheets.download( structured_sheet_id="ss_01kfxgjd94fn9stqm42nejb627", ) print(response) content = response.read() print(content) ``` ## Domain Types ### Structured Sheet Response - `class StructuredSheetResponse: …` Response representing a structured sheet conversion job. This is returned from POST (create), GET (retrieve), and list endpoints. - `id: str` The unique identifier for this structured sheet conversion. - `created_at: datetime` The timestamp when the conversion was started. - `file_id: str` The unique identifier for the source file. - `object: Literal["structured_sheet"]` The object type, which is always 'structured_sheet'. - `"structured_sheet"` - `status: Literal["queued", "in_progress", "completed", 2 more]` The current processing status. - `"queued"` - `"in_progress"` - `"completed"` - `"failed"` - `"cancelled"` - `updated_at: datetime` The timestamp when the conversion was last updated. - `last_error: Optional[LastError]` Error information when processing fails. - `code: str` A machine-readable error code. - `message: str` A human-readable description of the error. - `sheet_names: Optional[List[str]]` List of sheet names included in this conversion. - `table_count: Optional[int]` Number of tables extracted from the workbook. Only present when status is 'completed'. # Tables ## List tables in structured sheet `structured_sheets.tables.list(strstructured_sheet_id, TableListParams**kwargs) -> SyncCursorIDPage[TableResponse]` **get** `/v1/structured-sheets/{structured_sheet_id}/tables` List all tables extracted from the structured sheet. Only available when conversion status is 'completed'. ### Parameters - `structured_sheet_id: str` The unique identifier of the structured sheet conversion. - `after: Optional[str]` A cursor for pagination. Use the `last_id` from a previous response to fetch the next page of results. - `limit: Optional[int]` Maximum number of tables to return per page. ### Returns - `class TableResponse: …` Response representing a table extracted from a structured sheet. This is returned from GET (retrieve) and list table endpoints. Table names use a composite format: {normalized_sheet_name}__{table_name}. - `id: str` The unique identifier for this table. - `created_at: datetime` The timestamp when this table was created. - `name: str` Composite table name: {normalized_sheet_name}__{table_name}. Uses lowercase snake_case. Aggregation tables end with '__aggregations'. Two special metadata tables exist per structured sheet: '__deeptable_workbook_metadata' (workbook provenance info) and '__deeptable_table_overview' (summary of all tables). Example: 'staffing__head_count' or 'staffing__head_count__aggregations'. - `object: Literal["table"]` The object type, which is always 'table'. - `"table"` - `sheet_name: str` The original Excel sheet name this table came from. - `structured_sheet_id: str` The ID of the structured sheet this table belongs to. - `type: Literal["relational", "aggregation", "tableless", "metadata"]` The type of table (relational, aggregation, tableless, or metadata). - `"relational"` - `"aggregation"` - `"tableless"` - `"metadata"` ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) page = client.structured_sheets.tables.list( structured_sheet_id="ss_01kfxgjd94fn9stqm42nejb627", ) page = page.data[0] print(page.id) ``` #### Response ```json { "data": [ { "id": "tbl_01kfxgjd94fn9stqm45rqr2pnz", "created_at": "2026-01-15T10:35:00Z", "name": "staffing__head_count", "object": "table", "sheet_name": "Staffing", "structured_sheet_id": "ss_01kfxgjd94fn9stqm42nejb627", "type": "relational" }, { "id": "tbl_02abc2def3ghjkmnpqrs4uvwxz", "created_at": "2026-01-15T10:35:00Z", "name": "staffing__head_count__aggregations", "object": "table", "sheet_name": "Staffing", "structured_sheet_id": "ss_01kfxgjd94fn9stqm42nejb627", "type": "aggregation" } ], "has_more": false, "object": "list", "first_id": "tbl_01kfxgjd94fn9stqm45rqr2pnz", "last_id": "tbl_02abc2def3ghjkmnpqrs4uvwxz" } ``` ## Retrieve a table `structured_sheets.tables.retrieve(strtable_id, TableRetrieveParams**kwargs) -> TableResponse` **get** `/v1/structured-sheets/{structured_sheet_id}/tables/{table_id}` Get details of a specific table extracted from the structured sheet. Only available when conversion status is 'completed'. ### Parameters - `structured_sheet_id: str` The unique identifier of the structured sheet conversion. - `table_id: str` The unique identifier of the table. ### Returns - `class TableResponse: …` Response representing a table extracted from a structured sheet. This is returned from GET (retrieve) and list table endpoints. Table names use a composite format: {normalized_sheet_name}__{table_name}. - `id: str` The unique identifier for this table. - `created_at: datetime` The timestamp when this table was created. - `name: str` Composite table name: {normalized_sheet_name}__{table_name}. Uses lowercase snake_case. Aggregation tables end with '__aggregations'. Two special metadata tables exist per structured sheet: '__deeptable_workbook_metadata' (workbook provenance info) and '__deeptable_table_overview' (summary of all tables). Example: 'staffing__head_count' or 'staffing__head_count__aggregations'. - `object: Literal["table"]` The object type, which is always 'table'. - `"table"` - `sheet_name: str` The original Excel sheet name this table came from. - `structured_sheet_id: str` The ID of the structured sheet this table belongs to. - `type: Literal["relational", "aggregation", "tableless", "metadata"]` The type of table (relational, aggregation, tableless, or metadata). - `"relational"` - `"aggregation"` - `"tableless"` - `"metadata"` ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) table_response = client.structured_sheets.tables.retrieve( table_id="tbl_01kfxgjd94fn9stqm45rqr2pnz", structured_sheet_id="ss_01kfxgjd94fn9stqm42nejb627", ) print(table_response.id) ``` #### Response ```json { "id": "tbl_01kfxgjd94fn9stqm45rqr2pnz", "created_at": "2026-01-15T10:35:00Z", "name": "staffing__head_count", "object": "table", "sheet_name": "Staffing", "structured_sheet_id": "ss_01kfxgjd94fn9stqm42nejb627", "type": "relational" } ``` ## Download table data `structured_sheets.tables.download(strtable_id, TableDownloadParams**kwargs) -> BinaryResponseContent` **get** `/v1/structured-sheets/{structured_sheet_id}/tables/{table_id}/download` Download the table data in the specified format. Available formats: - `parquet`: Apache Parquet columnar format (recommended for data analysis) - `csv`: Comma-separated values (compatible with any spreadsheet application) ### Parameters - `structured_sheet_id: str` The unique identifier of the structured sheet conversion. - `table_id: str` The unique identifier of the table. - `format: Literal["parquet", "csv"]` The format to download the table data in. - `"parquet"` - `"csv"` ### Returns - `BinaryResponseContent` ### Example ```python import os from deeptable import DeepTable client = DeepTable( api_key=os.environ.get("DEEPTABLE_API_KEY"), # This is the default and can be omitted ) response = client.structured_sheets.tables.download( table_id="tbl_01kfxgjd94fn9stqm45rqr2pnz", structured_sheet_id="ss_01kfxgjd94fn9stqm42nejb627", format="parquet", ) print(response) content = response.read() print(content) ``` ## Domain Types ### Table Response - `class TableResponse: …` Response representing a table extracted from a structured sheet. This is returned from GET (retrieve) and list table endpoints. Table names use a composite format: {normalized_sheet_name}__{table_name}. - `id: str` The unique identifier for this table. - `created_at: datetime` The timestamp when this table was created. - `name: str` Composite table name: {normalized_sheet_name}__{table_name}. Uses lowercase snake_case. Aggregation tables end with '__aggregations'. Two special metadata tables exist per structured sheet: '__deeptable_workbook_metadata' (workbook provenance info) and '__deeptable_table_overview' (summary of all tables). Example: 'staffing__head_count' or 'staffing__head_count__aggregations'. - `object: Literal["table"]` The object type, which is always 'table'. - `"table"` - `sheet_name: str` The original Excel sheet name this table came from. - `structured_sheet_id: str` The ID of the structured sheet this table belongs to. - `type: Literal["relational", "aggregation", "tableless", "metadata"]` The type of table (relational, aggregation, tableless, or metadata). - `"relational"` - `"aggregation"` - `"tableless"` - `"metadata"`