Skip to content
Data Exports

Data Exports

Data Exports gives every ShipHero customer weekly full exports and delta exports every six hours at no additional cost. Accounts that need fresher data can upgrade to the paid tier. Use the data_exports Public API query to find completed runs and download account-scoped Parquet files.

Tiers

TierFull exportsDelta exportsAvailability
FreeOne per weekOne every six hoursEvery account, enabled by default
PaidOne per dayOne every 30 minutesContact your Customer Success Manager to enable it

The data_exports query, arguments, and response format are the same on both tiers. Only the export frequency changes.

Export schedule and file format

  • Full exports run weekly on the free tier and daily on the paid tier. For an explicit timestamp range, the API returns the first completed full export from each UTC week (free tier) or UTC day (paid tier) touched by that range. The selected run may be earlier than timestamp_from because it represents that week’s or day’s full export.
  • On the free tier, delta exports use six-hour UTC slots starting at 00:00, 06:00, 12:00, and 18:00. Each export can include changes from up to eight hours before the run.
  • On the paid tier, delta exports use 30-minute UTC slots starting on the hour and the half hour.
  • The API returns the first completed delta export in each matching slot.
  • Files use Parquet format with Snappy compression.
  • In some cases, a table can contain more than one file. Download every entry in files to read the complete table for that run.
  • Signed URLs expire after 24 hours. Run the query again when a URL expires.

Request arguments

The data_exports query accepts these arguments:

  • export_types is required. Pass FULL, DELTA, or both.
  • timestamp_from is an optional inclusive ISO 8601 timestamp.
  • timestamp_to is an optional exclusive ISO 8601 timestamp. It requires timestamp_from. If omitted when timestamp_from is present, it defaults to the current time.
  • modules optionally limits the response to specific export modules. When provided, it must contain at least one module.

Omit both timestamps to request the latest eligible export for each requested type. Send both timestamps in UTC.

For an explicit range, timestamp_from must be before the current time. When you provide timestamp_to, it must be later than timestamp_from.

Supported module filters

ModuleGraphQL value
OrdersORDERS
ShipmentsSHIPMENTS
ReturnsRETURNS
ProductsPRODUCTS
InventoryINVENTORY
Purchase ordersPURCHASE_ORDERS
3PLTHREEPL
UsersUSERS
LaborLABOR

Public API example

The following query requests full and delta exports in a UTC range and limits the results to the Orders and Shipments modules.

query DataExports(
  $exportTypes: [DataExportType!]!
  $timestampFrom: ISODateTime
  $timestampTo: ISODateTime
  $modules: [DataExportModuleName!]
) {
  data_exports(
    export_types: $exportTypes
    timestamp_from: $timestampFrom
    timestamp_to: $timestampTo
    modules: $modules
  ) {
    request_id
    data {
      full {
        run_id
        modules {
          name
          tables {
            name
            files {
              signed_url
              size
              created_at
            }
          }
        }
      }
      delta {
        run_id
        modules {
          name
          tables {
            name
            files {
              signed_url
              size
              created_at
            }
          }
        }
      }
    }
  }
}

Use these variables with the query:

{
  "exportTypes": ["FULL", "DELTA"],
  "timestampFrom": "2026-08-10T00:00:00Z",
  "timestampTo": "2026-08-11T00:00:00Z",
  "modules": ["ORDERS", "SHIPMENTS"]
}

To request the latest full export without a timestamp range, send only the required export type:

{
  "exportTypes": ["FULL"]
}

Reading the response

  • full contains the selected full export runs.
  • delta contains the selected delta export runs.
  • run_id identifies the export run.
  • modules[].name is the lower-case module name, such as orders.
  • tables[].name identifies a table in the module.
  • files[] contains every Parquet file part for the table.
  • signed_url is the temporary file URL.
  • size is the file size in bytes.
  • created_at is the file creation time in UTC.

If no data matches the requested range or module filters, the corresponding full or delta list is empty. If ShipHero cannot find a complete export for a selected period, the query fails instead of returning partial data.

Available data tables

Data Exports can include the following tables. The API returns the tables present in the selected run after applying any module filters.

Orders

  • orders, main order records with customer information, totals, and status
  • line_items, SKUs and quantities for each order
  • order_tags, tags applied to orders
  • _order_history, order updates and status changes

Shipments

  • shipments, shipment records with tracking and carrier data
  • shipped_line_items, line items included in each shipment
  • shipping_labels, metadata for generated shipping labels
  • shipment_attributes, shipment-level key and value attributes
  • shipped_line_item_lots, links between shipped items and inventory lots
  • shipped_items, physical items included in shipments

Returns

  • returns, return authorization records
  • rma_labels, shipping labels associated with returns
  • return_items, items included in each return

Products

  • products, product records and attributes
  • product_tags, tags applied to products
  • product_images2, product image URLs and display order
  • lots, lot tracking information
  • warehouse_products, warehouse-specific product data
  • kitting_map, kit and bundle components
  • assembly_map, assembled products and their component quantities
  • product_cases, case pack configurations

Inventory

  • bins, warehouse storage bins
  • item_bins, product quantities by bin
  • location_change_log, inventory movements between bins
  • location_types, location classifications
  • cycle_count_v2_batches, cycle count batches
  • cycle_count_v2_batch_items, items in cycle count batches
  • cycle_count_v2_batch_discrepancies, discrepancies found during cycle counts

Purchase orders

  • purchase_orders, purchase order records
  • purchase_order_line_items, items in each purchase order
  • vendors, supplier records
  • products_vendors, product and vendor relationships

3PL metadata

  • warehouse_to_customers, relationships between 3PL warehouses and customers

Users

  • users, user accounts, roles, and permissions

Labor

  • activities, labor activities performed by WorkforceHero workers
  • alerts, alerts generated during worker activities
  • jobs, warehouse job definitions
  • shifts_management, warehouse shift definitions
  • special_projects, non-standard warehouse projects
  • warehouses, warehouses enabled for the Labor module
  • workers, WorkforceHero worker records

Additional tables may be added over time.

Authentication and access

The query requires the view:data_exports scope. Authenticate with a Developer User created through the third-party developer flow or a regular user account with Data Exports enabled.

Migrating to data_exports

ShipHero provides three GraphQL queries for Data Exports:

QueryStatusResponse
lakehero_data_exportDeprecatedFlat file list
recurring_data_exportDeprecatedFlat file list
data_exportsRecommendedFiles grouped by type, run, module, and table

These are separate GraphQL queries, not API versions selected through a version parameter.

Why migrate

The data_exports query allows integrations to:

  • Request FULL, DELTA, or both export types explicitly.
  • Retrieve the latest eligible export or multiple runs within a time range.
  • Filter exports by module.
  • Identify completed exports with a run_id.

The same query works for free and paid accounts. The account plan changes the export frequency, not the API contract.

New query

query DataExports(
  $exportTypes: [DataExportType!]!
  $timestampFrom: ISODateTime
  $timestampTo: ISODateTime
  $modules: [DataExportModuleName!]
) {
  data_exports(
    export_types: $exportTypes
    timestamp_from: $timestampFrom
    timestamp_to: $timestampTo
    modules: $modules
  ) {
    data {
      full {
        run_id
        modules {
          name
          tables {
            name
            files {
              signed_url
              size
              created_at
            }
          }
        }
      }
      delta {
        run_id
        modules {
          name
          tables {
            name
            files {
              signed_url
              size
              created_at
            }
          }
        }
      }
    }
  }
}

Omit both timestamps to request the latest eligible export. Provide timestampFrom and timestampTo to retrieve exports within a specific period.

How to migrate

Migration is the same for lakehero_data_export and recurring_data_export because both use the previous flat response format. Update the integration as follows:

  1. Replace the previous query with data_exports.
  2. Replace date and run_hour_utc with timestamp_from and timestamp_to.
  3. Select FULL, DELTA, or both using export_types.
  4. Read tables from full[].modules[].tables[] or delta[].modules[].tables[].
  5. Use the containing full or delta collection instead of detecting the export type from the filename or URL.
  6. Use run_id to identify runs that have already been processed.
  7. Process every entry in tables[].files. A table may contain multiple Parquet files; process all returned files together to load the complete table.

For recurring DELTA loads, request a time range and process every returned run. Each DELTA export covers an eight-hour window (previously 48 hours), so exports will contain overlapping changes. Requesting only the latest DELTA may skip intermediate exports. Make loads idempotent to handle the overlap.

Frequency and access

  • Free accounts receive weekly FULL exports and DELTA exports every six hours.
  • Paid accounts receive daily FULL exports and DELTA exports every 30 minutes.
  • All Data Export queries require the view:data_exports scope and a user with Public API and Data Exports enabled.
  • Signed URLs expire after 24 hours. Run the query again to generate new URLs when necessary.