Boardera Platform API Documentation

This documentation provides detailed instructions for using the Boardera Platform API. If you are a Boardera Development Partner looking to integrate with our platform, you're in the right place! Using this API, you will be able to create PCB bare board and assembly projects, benefit from our automated project analysis, export comprehensive product data — including bare board specs, assembly details, BOM, and pricing — for use in your own systems, and retrieve estimated pricing directly from participating manufacturers.

Contact

Boardera API Support

api.support@boardera.ca

API Endpoints
https://api.boardera.io/api/v1
Headers
# Please define this header in each call as authentication
X-Boardera-Key: <YOUR_API_KEY>
Version

Aug-2026-5

Schema Version

2026-05

Getting Started

To get started, register for an API key through our self-service portal at boardera.io. Most use cases can be onboarded directly through the portal; if you have questions or need an evaluation for a more involved integration, contact us at api.sales@boardera.ca.

Get Your API Key

After signing up at boardera.io, you can generate and manage your API keys directly from the portal. Authentication with our API is simple - provide the API Key with every call in the X-Boardera-Key header. We highly recommend making all API calls server-side to protect this secret information, which allows for creation of projects on your behalf.

Typical Workflow

A typical integration with the Boardera API follows these steps:

  1. Once a user is ready to send their PCB project files to Boardera, call the createProject function. Save the returned project _id — you'll need it for every subsequent step.
  2. Generate per-file upload policies using the getFileUploadPolicies function, then use those policies to upload the project's design files (ODB++ or Gerber), BOM, and any other supporting files directly to our S3 bucket. The BOM is uploaded through the same flow by indicating its file type as "BOM".
  3. Initiate project analysis by calling the analyzeProject function; you can poll this function to find out when the analysis is complete (please leave at least half second delays between checks).
  4. Once analysis is complete, call the exportProduct function to retrieve the full product export — bare board specs, assembly options, BOM details, pad/trace data, drill data, stackup, file notes, provenance, and (where applicable) pricing. Like analyzeProject, this is a polled operation: exportProduct returns a job reference, which you then poll using getExportProductJob until the export is complete (again, please leave at least half second delays between checks).

Connect Your AI Assistant (MCP)

Boardera hosts a remote Model Context Protocol (MCP) server that exposes the Decode workflow as tools your AI assistant can call directly — create a project, upload design files, run analysis, and pull back the costed export as a conversation, with no client code to write.

Endpoint: https://boardera.io/mcp (streamable HTTP, remote only — there is no local/stdio package).

Supported clients: Claude (web, desktop, mobile), ChatGPT, Cursor, and any MCP client supporting streamable HTTP with OAuth. Add the endpoint as a custom connector; the client registers itself automatically.

Signing in: the first connection opens a Boardera sign-in and consent page in your browser. Approving it links the assistant to your Boardera account. Your long-lived API key is never shared with the assistant — sessions use short-lived tokens that refresh automatically, and you can revoke access by disconnecting the server in your assistant. Tool usage meters against the same token allowance as the rest of your plan; see boardera.io/pricing for plan limits.

Tools

Tool Purpose and inputs
boardera_account_status Confirm the connection: account name, email, subscription status, API readiness, data region, and current-month token usage vs. allowance. No inputs.
decode_create_project Create a project. Optional: name, quantity, designer email, company name, external account id. Returns the project id.
decode_list_projects List your projects (id + name). Optional: limit, cursor (pagination), sortBy creationDate or lastModifiedDate.
decode_delete_project Soft-delete a project by id (restorable).
decode_restore_project Restore a deleted project by id.
decode_upload_files Open an inline drop zone in the chat for a project's design files; also returns a single-use hosted upload link as fallback. Analysis starts automatically.
decode_upload_files_from_urls Attach files from https URLs (url, path, optional type per file). Analysis starts automatically.
decode_analyze_project Run analysis on a project. Optional toggles: skipPricing, skipBomProcessing, skipFileNoteExtraction (persist on the project across re-runs).
decode_analysis_status Poll analysis until complete; returns warnings such as "no copper layers extracted".
decode_costing_summary Chat-sized costed summary: unit price, order total, PCB/assembly/BOM subtotals, top cost drivers, key specs, BOM stats. Inputs: productId (= projectId), optional quantity and manufacturerId.
decode_price_breaks Compare costing at up to 3 quantities in one call: unit price, order total, and subtotals per quantity. Inputs: productId (= projectId), quantities (1-3), optional manufacturerId.
decode_project_details Project details plus the fabrication spec extracted from the design files: layers, dimensions, material, finish, solder mask, IPC class, panel info. Input: projectId.
decode_bom_review BOM line items with lifecycle, RoHS/REACH, and sourcing flags plus a whole-BOM risk rollup. Inputs: productId (= projectId), optional offset/limit for very large BOMs.
decode_run_dfm Run a SpeedDFM manufacturability check; findings come back grouped by rule with severity and counts. Charges tokens when results are retrieved. Inputs: productId (= projectId), optional manufacturerId.
decode_dfm_status Poll a DFM job by jobId; returns the grouped findings when complete.
decode_export_product Full costed product export in the tool response (large — often 100-300 KB). Inputs: productId (= projectId), optional quantity and manufacturerId.
decode_export_status Poll an export job by jobId; returns the full Universal JSON when complete.

Uploading files from chat

Where the host renders inline MCP apps (Claude and ChatGPT both do), decode_upload_files shows a drop zone right in the conversation — drop Gerbers, a BOM, or a whole folder and analysis runs automatically. On hosts without inline apps, the same tool returns a single-use hosted upload link (valid 10 minutes) that opens the Boardera upload page for the project. If the files are already hosted, the assistant can use decode_upload_files_from_urls instead.

Quickstart

  1. Add https://boardera.io/mcp as a connector in your assistant and approve the Boardera sign-in.
  2. Ask "check my Boardera connection" — the assistant calls boardera_account_status.
  3. Ask "create a Decode project for 25 boards called Sensor Rev B and let me upload the design".
  4. Drop your design files in the drop zone (or share a link to a hosted zip). Analysis runs automatically.
  5. Ask "what's driving the price?" — the assistant calls decode_costing_summary and answers from the unit price, subtotals, and top cost drivers. For the complete line-item dataset, ask for the full export.

Other prompts that exercise the tools: "compare pricing at qty 100, 500, and 1000" (decode_price_breaks), "does the extracted spec match my design?" (decode_project_details), "any end-of-life or non-RoHS parts in the BOM?" (decode_bom_review), "flag the DFM issues" (decode_run_dfm), "list my recent projects".

Using Pricing Display (Enterprise Custom Plan)

You can use our Pricing Display when you want your users to go from the project they have in your application to the online store of the manufacturer of their choice.

Using our API, you will be able to price a project accross different manufacturers, using functions like getManufacturers and getProjectPrices.

An example of our Pricing Display UI is the following:

As seen, it lets your users tweak the quantity and build time for their project, and have an updated pricing in real time for the manufacturer of their choice. It also gives them other information such as the dimensions of the board or number of BOM parts that are available.

Integrating with it

  1. Please load our Javascript helper in your application, using the following script tag: <script type="text/javascript" src="https://cdn.boardera.io/pcbqp.js"/>
  2. To open the Pricing Display, you will need to have a token. You can request it by calling the mutation openProject, passing it the project id, and the manufacturer id your user selected.
  3. After retrieving the token, you can call the client-side global function consumeBoarderaCopyToken, which will open the Pricing Display.

The follwing is a code snippet for the last step:

// client-side
const token = '....';
window.consumeBoarderaCopyToken(token);

Queries

alive

Response

Returns a Boolean!

Example

Query
query alive {
  alive
}
Response
{"data": {"alive": false}}

dfmEntryImage

Description

Kick off (or return the existing job for) a composite-image render of one SpeedDFM violation, identified by (productId, x, y). Same render the DfmResultEntry.image field resolver produces — separate top-level query so a client can request the tile only when the user opens a specific marker instead of paying for every marker up front.

Returns null when the coordinates are invalid, the project is not accessible to the caller, or DFM is not enabled for this consumer or vendor.

Poll retrieveAsset with assetExportJobId to fetch the rendered PNG when ready.

Response

Returns an AssetExportJobReference

Arguments
Name Description
y - Float! Marker Y in mm.
x - Float! Marker X in mm.
productId - String!

Example

Query
query dfmEntryImage(
  $y: Float!,
  $x: Float!,
  $productId: String!
) {
  dfmEntryImage(
    y: $y,
    x: $x,
    productId: $productId
  ) {
    assetExportJobId
  }
}
Variables
{
  "y": 123.45,
  "x": 987.65,
  "productId": "abc123"
}
Response
{
  "data": {
    "dfmEntryImage": {
      "assetExportJobId": "abc123"
    }
  }
}

exportProduct

Description

Export a product including bare board specs, assembly options, BOM details, pad/trace data, drill data, stackup, file notes, and provenance.

Kicks off pricing (if applicable) and returns a job reference. If pricing is already cached, the export completes immediately and status is "completed". Otherwise status is "processing" — poll with getExportProductJob.

Scoped consumers receive pricing automatically from their linked manufacturer. Non-scoped consumers can include pricing by providing a manufacturerId from their manufacturer network (see getManufacturers). If manufacturerId is omitted, non-scoped consumers receive design data only.

To receive costing, either select it in this kickoff query or omit data entirely (the typical two-phase kickoff that selects only { jobId status }). A kickoff that selects data without costing is treated as a design-only request and pricing is skipped.

Response

Returns an ExportProductJobResponse!

Arguments
Name Description
manufacturerId - Int Optional manufacturer ID for non-scoped consumers. When provided, pricing from this manufacturer is included in the export. The manufacturer must be in your network (see getManufacturers). Ignored for scoped consumers.
quantity - Int
productId - String!

Example

Query
query exportProduct(
  $manufacturerId: Int,
  $quantity: Int,
  $productId: String!
) {
  exportProduct(
    manufacturerId: $manufacturerId,
    quantity: $quantity,
    productId: $productId
  ) {
    jobId
    status
    data {
      meta {
        schemaVersion
        generatedAt
        supplierName
      }
      kind
      productId
      partNumber
      specs {
        industrySector
        ipcClassIII
        bareBoard {
          customerSupplied
          hasLayerFiles
          boardThickness {
            value
            unit
          }
          numOfLayers
          boardWidth {
            value
            unit
          }
          boardLength {
            value
            unit
          }
          copperThickness {
            value
            unit
          }
          layersCuThickness {
            value
            unit
          }
          material
          materialOtherText
          finishing
          finishingOtherText
          hdi
          controlledDepthDrilling
          goldFingers
          customStackup
          viaPlugging
          solderMaskColor
          solderMaskColorOtherText
          silkscreenColor
          silkscreenColorOtherText
          layerFilesNotRequired
          electricalTesting
          controlledImpedance
          blindAndBuriedVias
          panel {
            panelWidth {
              ...ExportValueWithUnitFragment
            }
            panelLength {
              ...ExportValueWithUnitFragment
            }
            designFilesArePanel
            boardsPerAsmPanel
          }
        }
        assemblyOptions {
          conformalCoating
          functionalTesting
          xRayInspection
          firstArticleInspection
          bedOfNailsTesting
          inBoardProgramming
          automatedOpticalInspection
          other
          otherText
        }
        projectBom {
          id
          partNumber
          pricedPartNumber
          partManufacturer
          internalPartNumber
          customerPartNumber
          mfrIdentifier
          customerIdentifier
          mountType
          description
          notes
          potentialPackage
          sourcingOption
          substitutions
          referenceDesignators {
            designator
            dnp
          }
          quantityPerBoard
          customerSupplied
          lifeCycleStatus
          lifeCycleStatusRaw
          rohsStatus
          rohsStatusRaw
          reachStatus
          reachStatusRaw
          rohsCompliant
          reachCompliant
          countryOfOrigin
          minimumOrderQuantity
          itemClass
          leadCount
          lastPricingUpdate
        }
        stackup {
          type
          fileType
          typeIndex
          circuitBoardLayerNumber
          copperThickness {
            value
            unit
          }
          dielectricType
          dielectricThickness {
            value
            unit
          }
          plated
          drillSpanStart
          drillSpanEnd
          fileName
        }
        layerFileMapping {
          fileType
          layerName
          circuitBoardLayerNumber
          fileName
          maskArtwork
        }
        padTraceData {
          layers {
            layerName
            fileName
            circularPadCount
            rectangularPadCount
            totalPadCount
            minPadSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            maxPadSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            totalPadSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            traceCount
            minTraceWidth {
              ...ExportValueWithUnitFragment
            }
            maxTraceWidth {
              ...ExportValueWithUnitFragment
            }
            uniqueTraceWidths
            minSpacing {
              ...ExportValueWithUnitFragment
            }
            copperArea {
              ...ExportValueWithUnitFragment
            }
          }
          totalPadCount
          totalTraceCount
          minSpacing {
            value
            unit
          }
          totalCopperArea {
            value
            unit
          }
        }
        drillData {
          drillFiles {
            drillDescription
            fileName
            holeCount
            minHoleDiameter {
              ...ExportValueWithUnitFragment
            }
            maxHoleDiameter {
              ...ExportValueWithUnitFragment
            }
            totalHoleSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            drillKind
          }
          totalHoleCount
          holeDensity {
            value
            unit
          }
          throughHoleCount
          slotCount
          backDrillCount
          microViaCount
          blindBuriedCount
          mountingCount
          unknownDrillCount
        }
        fileNotes {
          text
          cleanedText
          foundIn {
            fileName
          }
        }
        fileTables {
          table
          foundIn {
            fileName
          }
        }
        provenance {
          areas {
            area
            entries {
              ...ExportProvenanceEntryFragment
            }
          }
          totalDecisions
        }
      }
      costing {
        scenarios {
          id
          name
          quantity
          buildTime
          panelizeBoards
          countryOfOrigin
          pricingLineItems {
            itemId
            group
            name
            multiplier
            cost {
              ...MoneyFragment
            }
            markupPercent
            markupValue {
              ...MoneyFragment
            }
            listPrice {
              ...MoneyFragment
            }
            listMargin
            margin
            listGrossProfit {
              ...MoneyFragment
            }
            grossProfit {
              ...MoneyFragment
            }
            discountPercent
            discountValue {
              ...MoneyFragment
            }
            isCustom
            details
            qty
            moq
            attrition
            orderQuantity
            unitPrice {
              ...MoneyFragment
            }
            unitSellPrice {
              ...MoneyFragment
            }
            total {
              ...MoneyFragment
            }
            totalSellPrice {
              ...MoneyFragment
            }
            customerSupplied
            specs {
              ...ExportPricingLineItemSpecsFragment
            }
          }
          projectCalculations {
            name
            value
          }
          calculations {
            name
            floatValue
            booleanValue
          }
          assemblyUnitPrice {
            value
            formatted
            currency
          }
          profitProjections {
            type
            mfrCost {
              ...MoneyFragment
            }
            markup
            listMargin
            margin
            listGrossProfit {
              ...MoneyFragment
            }
            grossProfit {
              ...MoneyFragment
            }
            listPrice {
              ...MoneyFragment
            }
            discountPercentage
            discountValue {
              ...MoneyFragment
            }
            price {
              ...MoneyFragment
            }
            overheadFactoredCost {
              ...MoneyFragment
            }
            landingValue {
              ...MoneyFragment
            }
            overheadFactor
          }
          validationDetails {
            bareBoardValidationSummary {
              ...ExportValidationSummaryFragment
            }
            assemblyValidationSummary {
              ...ExportValidationSummaryFragment
            }
            bomValidationSummary {
              ...ExportBomValidationSummaryFragment
            }
            bareBoardValidationIssues {
              ...ExportBareBoardValidationIssueFragment
            }
            assemblyWithSubstitutions {
              ...ExportAssemblySubstitutionFragment
            }
            assemblyPlacementIssues {
              ...ExportAssemblyPlacementIssueFragment
            }
          }
          subtotal
          unitPrice
          pcbSubtotal
          assemblySubtotal
          bomSubtotal
        }
      }
    }
    warnings {
      code
      message
    }
    errors {
      ... on ErrorExportProductNotFound {
        code
        message
      }
      ... on ErrorExportSupplierNotFound {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorExportInvalidQuantity {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{
  "manufacturerId": 987,
  "quantity": 123,
  "productId": "xyz789"
}
Response
{
  "data": {
    "exportProduct": {
      "jobId": "abc123",
      "status": "xyz789",
      "data": ExportProduct,
      "warnings": [ApiWarning],
      "errors": [ErrorExportProductNotFound]
    }
  }
}

exportQuote

Description

Export a full quote as JSON, including all line items, pricing breakdowns, BOM details, and profit projections.

Kicks off pricing for all line items and returns a job reference. If all pricing is cached, the export completes immediately. Otherwise poll with getExportQuoteJob.

This query is only available to scoped API consumers (manufacturer-scoped). The quote must belong to the API consumer's vendor.

To receive costing, either select it in this kickoff query or omit data entirely (the typical two-phase kickoff that selects only { jobId status }). A kickoff that selects data without costing is treated as a design-only request and pricing is skipped.

Response

Returns an ExportQuoteJobResponse!

Arguments
Name Description
quoteHeadId - Int!

Example

Query
query exportQuote($quoteHeadId: Int!) {
  exportQuote(quoteHeadId: $quoteHeadId) {
    jobId
    status
    data {
      meta {
        schemaVersion
        generatedAt
        supplierName
      }
      kind
      currency
      quote {
        quoteNumber
        quoteDate
        expiryDate
        customerCompanyName
        mainPOCName
        mainPOCPhone
        mainPOCEmail
        notesAndTerms
        shipTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        billTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        subtotal {
          value
          formatted
          currency
        }
        total {
          value
          formatted
          currency
        }
        shipping {
          value
          formatted
          currency
        }
        tax {
          value
          formatted
          currency
        }
        lineItems {
          kind
          lineItemId
          lineNumber
          sku
          productId
          partNumber
          comments
          pricing {
            quantity
            unitPrice {
              ...MoneyFragment
            }
          }
          specs {
            industrySector
            ipcClassIII
            bareBoard {
              ...ExportBareBoardFragment
            }
            assemblyOptions {
              ...ExportAssemblyOptionsFragment
            }
            projectBom {
              ...ExportProjectBomItemFragment
            }
            stackup {
              ...ExportStackupLayerFragment
            }
            layerFileMapping {
              ...ExportLayerFileMappingFragment
            }
            padTraceData {
              ...ExportPadTraceDataFragment
            }
            drillData {
              ...ExportDrillDataFragment
            }
            fileNotes {
              ...ExportFileNoteFragment
            }
            fileTables {
              ...ExportFileTableFragment
            }
            provenance {
              ...ExportProvenanceFragment
            }
          }
          costing {
            scenarios {
              ...ExportCostingScenarioFragment
            }
          }
        }
      }
    }
    errors {
      ... on ErrorExportQuoteNotFound {
        code
        message
      }
      ... on ErrorExportSupplierNotFound {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorExportNotScopedConsumer {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"quoteHeadId": 987}
Response
{
  "data": {
    "exportQuote": {
      "jobId": "abc123",
      "status": "xyz789",
      "data": ExportQuote,
      "errors": [ErrorExportQuoteNotFound]
    }
  }
}

exportQuoteLineItem

Description

Export a single line item from a quote, including pricing breakdown, BOM details, and profit projections, wrapped with quote context (quote number, currency, dates).

Kicks off pricing and returns a job reference. If pricing is cached, the export completes immediately. Otherwise poll with getExportQuoteLineItemJob.

This query is only available to scoped API consumers (manufacturer-scoped). The quote must belong to the API consumer's vendor.

To receive costing, either select it in this kickoff query or omit data entirely (the typical two-phase kickoff that selects only { jobId status }). A kickoff that selects data without costing is treated as a design-only request and pricing is skipped.

Response

Returns an ExportQuoteLineItemJobResponse!

Arguments
Name Description
lineItemId - Int!
quoteHeadId - Int!

Example

Query
query exportQuoteLineItem(
  $lineItemId: Int!,
  $quoteHeadId: Int!
) {
  exportQuoteLineItem(
    lineItemId: $lineItemId,
    quoteHeadId: $quoteHeadId
  ) {
    jobId
    status
    data {
      meta {
        schemaVersion
        generatedAt
        supplierName
      }
      kind
      currency
      quote {
        quoteNumber
        quoteDate
        expiryDate
        customerCompanyName
        mainPOCName
        mainPOCPhone
        mainPOCEmail
        notesAndTerms
        shipTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        billTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        subtotal {
          value
          formatted
          currency
        }
        total {
          value
          formatted
          currency
        }
        shipping {
          value
          formatted
          currency
        }
        tax {
          value
          formatted
          currency
        }
        lineItems {
          kind
          lineItemId
          lineNumber
          sku
          productId
          partNumber
          comments
          pricing {
            quantity
            unitPrice {
              ...MoneyFragment
            }
          }
          specs {
            industrySector
            ipcClassIII
            bareBoard {
              ...ExportBareBoardFragment
            }
            assemblyOptions {
              ...ExportAssemblyOptionsFragment
            }
            projectBom {
              ...ExportProjectBomItemFragment
            }
            stackup {
              ...ExportStackupLayerFragment
            }
            layerFileMapping {
              ...ExportLayerFileMappingFragment
            }
            padTraceData {
              ...ExportPadTraceDataFragment
            }
            drillData {
              ...ExportDrillDataFragment
            }
            fileNotes {
              ...ExportFileNoteFragment
            }
            fileTables {
              ...ExportFileTableFragment
            }
            provenance {
              ...ExportProvenanceFragment
            }
          }
          costing {
            scenarios {
              ...ExportCostingScenarioFragment
            }
          }
        }
      }
    }
    errors {
      ... on ErrorExportQuoteNotFound {
        code
        message
      }
      ... on ErrorExportLineItemNotFound {
        code
        message
      }
      ... on ErrorExportSupplierNotFound {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorExportNotScopedConsumer {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"lineItemId": 123, "quoteHeadId": 123}
Response
{
  "data": {
    "exportQuoteLineItem": {
      "jobId": "abc123",
      "status": "abc123",
      "data": ExportQuote,
      "errors": [ErrorExportQuoteNotFound]
    }
  }
}

exportSchemaVersions

Description

All supported JSON export schema versions.

Response

Returns [String!]!

Example

Query
query exportSchemaVersions {
  exportSchemaVersions
}
Response
{
  "data": {
    "exportSchemaVersions": ["abc123"]
  }
}

getDFM

Description

Kick off a SpeedDFM analysis for a project and return a job reference.

If a recent DFM result is already cached for this project's current file set, the job is returned with status: "completed" and data populated immediately. Otherwise status is "processing" — poll with retrieveDFM.

DFM tokens are charged when results are retrieved (see retrieveDFM).

Requires the project to have completed analyzeProject first. Returns ANALYSIS_NOT_COMPLETE if advisors are still running for this project.

Response

Returns a DfmJobResponse!

Arguments
Name Description
manufacturerId - Int Optional manufacturer ID for non-scoped consumers — selects the supplier-specific DFM ruleset. Ignored for scoped consumers.
productId - String!

Example

Query
query getDFM(
  $manufacturerId: Int,
  $productId: String!
) {
  getDFM(
    manufacturerId: $manufacturerId,
    productId: $productId
  ) {
    jobId
    status
    data {
      results {
        ruleId
        ruleName
        ruleType
        severity
        layerName
        layerType
        x
        y
        measuredValue
        threshold
        unit
        description
        image {
          assetExportJobId
        }
      }
      summary {
        fabricationErrorCount
        fabricationWarningCount
        assemblyErrorCount
        assemblyWarningCount
        generalCount
        analysisStatus
      }
      reportUrl {
        assetExportJobId
      }
    }
    errors {
      ... on ErrorExportProductNotFound {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorAnalysisNotComplete {
        code
        message
      }
      ... on ErrorDfmFailed {
        code
        message
      }
      ... on ErrorDfmNotAvailable {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{
  "manufacturerId": 987,
  "productId": "abc123"
}
Response
{
  "data": {
    "getDFM": {
      "jobId": "xyz789",
      "status": "xyz789",
      "data": DfmResults,
      "errors": [ErrorExportProductNotFound]
    }
  }
}

getExportProductJob

Description

Poll for the result of an exportProduct job.

If pricing has finished since the job was created, the export is completed lazily and status changes to "completed" with the data populated.

Warnings are returned by exportProduct on the initial response, not by this poll endpoint.

Response

Returns an ExportProductJobResponse!

Arguments
Name Description
jobId - String!

Example

Query
query getExportProductJob($jobId: String!) {
  getExportProductJob(jobId: $jobId) {
    jobId
    status
    data {
      meta {
        schemaVersion
        generatedAt
        supplierName
      }
      kind
      productId
      partNumber
      specs {
        industrySector
        ipcClassIII
        bareBoard {
          customerSupplied
          hasLayerFiles
          boardThickness {
            value
            unit
          }
          numOfLayers
          boardWidth {
            value
            unit
          }
          boardLength {
            value
            unit
          }
          copperThickness {
            value
            unit
          }
          layersCuThickness {
            value
            unit
          }
          material
          materialOtherText
          finishing
          finishingOtherText
          hdi
          controlledDepthDrilling
          goldFingers
          customStackup
          viaPlugging
          solderMaskColor
          solderMaskColorOtherText
          silkscreenColor
          silkscreenColorOtherText
          layerFilesNotRequired
          electricalTesting
          controlledImpedance
          blindAndBuriedVias
          panel {
            panelWidth {
              ...ExportValueWithUnitFragment
            }
            panelLength {
              ...ExportValueWithUnitFragment
            }
            designFilesArePanel
            boardsPerAsmPanel
          }
        }
        assemblyOptions {
          conformalCoating
          functionalTesting
          xRayInspection
          firstArticleInspection
          bedOfNailsTesting
          inBoardProgramming
          automatedOpticalInspection
          other
          otherText
        }
        projectBom {
          id
          partNumber
          pricedPartNumber
          partManufacturer
          internalPartNumber
          customerPartNumber
          mfrIdentifier
          customerIdentifier
          mountType
          description
          notes
          potentialPackage
          sourcingOption
          substitutions
          referenceDesignators {
            designator
            dnp
          }
          quantityPerBoard
          customerSupplied
          lifeCycleStatus
          lifeCycleStatusRaw
          rohsStatus
          rohsStatusRaw
          reachStatus
          reachStatusRaw
          rohsCompliant
          reachCompliant
          countryOfOrigin
          minimumOrderQuantity
          itemClass
          leadCount
          lastPricingUpdate
        }
        stackup {
          type
          fileType
          typeIndex
          circuitBoardLayerNumber
          copperThickness {
            value
            unit
          }
          dielectricType
          dielectricThickness {
            value
            unit
          }
          plated
          drillSpanStart
          drillSpanEnd
          fileName
        }
        layerFileMapping {
          fileType
          layerName
          circuitBoardLayerNumber
          fileName
          maskArtwork
        }
        padTraceData {
          layers {
            layerName
            fileName
            circularPadCount
            rectangularPadCount
            totalPadCount
            minPadSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            maxPadSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            totalPadSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            traceCount
            minTraceWidth {
              ...ExportValueWithUnitFragment
            }
            maxTraceWidth {
              ...ExportValueWithUnitFragment
            }
            uniqueTraceWidths
            minSpacing {
              ...ExportValueWithUnitFragment
            }
            copperArea {
              ...ExportValueWithUnitFragment
            }
          }
          totalPadCount
          totalTraceCount
          minSpacing {
            value
            unit
          }
          totalCopperArea {
            value
            unit
          }
        }
        drillData {
          drillFiles {
            drillDescription
            fileName
            holeCount
            minHoleDiameter {
              ...ExportValueWithUnitFragment
            }
            maxHoleDiameter {
              ...ExportValueWithUnitFragment
            }
            totalHoleSurfaceArea {
              ...ExportValueWithUnitFragment
            }
            drillKind
          }
          totalHoleCount
          holeDensity {
            value
            unit
          }
          throughHoleCount
          slotCount
          backDrillCount
          microViaCount
          blindBuriedCount
          mountingCount
          unknownDrillCount
        }
        fileNotes {
          text
          cleanedText
          foundIn {
            fileName
          }
        }
        fileTables {
          table
          foundIn {
            fileName
          }
        }
        provenance {
          areas {
            area
            entries {
              ...ExportProvenanceEntryFragment
            }
          }
          totalDecisions
        }
      }
      costing {
        scenarios {
          id
          name
          quantity
          buildTime
          panelizeBoards
          countryOfOrigin
          pricingLineItems {
            itemId
            group
            name
            multiplier
            cost {
              ...MoneyFragment
            }
            markupPercent
            markupValue {
              ...MoneyFragment
            }
            listPrice {
              ...MoneyFragment
            }
            listMargin
            margin
            listGrossProfit {
              ...MoneyFragment
            }
            grossProfit {
              ...MoneyFragment
            }
            discountPercent
            discountValue {
              ...MoneyFragment
            }
            isCustom
            details
            qty
            moq
            attrition
            orderQuantity
            unitPrice {
              ...MoneyFragment
            }
            unitSellPrice {
              ...MoneyFragment
            }
            total {
              ...MoneyFragment
            }
            totalSellPrice {
              ...MoneyFragment
            }
            customerSupplied
            specs {
              ...ExportPricingLineItemSpecsFragment
            }
          }
          projectCalculations {
            name
            value
          }
          calculations {
            name
            floatValue
            booleanValue
          }
          assemblyUnitPrice {
            value
            formatted
            currency
          }
          profitProjections {
            type
            mfrCost {
              ...MoneyFragment
            }
            markup
            listMargin
            margin
            listGrossProfit {
              ...MoneyFragment
            }
            grossProfit {
              ...MoneyFragment
            }
            listPrice {
              ...MoneyFragment
            }
            discountPercentage
            discountValue {
              ...MoneyFragment
            }
            price {
              ...MoneyFragment
            }
            overheadFactoredCost {
              ...MoneyFragment
            }
            landingValue {
              ...MoneyFragment
            }
            overheadFactor
          }
          validationDetails {
            bareBoardValidationSummary {
              ...ExportValidationSummaryFragment
            }
            assemblyValidationSummary {
              ...ExportValidationSummaryFragment
            }
            bomValidationSummary {
              ...ExportBomValidationSummaryFragment
            }
            bareBoardValidationIssues {
              ...ExportBareBoardValidationIssueFragment
            }
            assemblyWithSubstitutions {
              ...ExportAssemblySubstitutionFragment
            }
            assemblyPlacementIssues {
              ...ExportAssemblyPlacementIssueFragment
            }
          }
          subtotal
          unitPrice
          pcbSubtotal
          assemblySubtotal
          bomSubtotal
        }
      }
    }
    warnings {
      code
      message
    }
    errors {
      ... on ErrorExportProductNotFound {
        code
        message
      }
      ... on ErrorExportSupplierNotFound {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorExportInvalidQuantity {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"jobId": "abc123"}
Response
{
  "data": {
    "getExportProductJob": {
      "jobId": "xyz789",
      "status": "xyz789",
      "data": ExportProduct,
      "warnings": [ApiWarning],
      "errors": [ErrorExportProductNotFound]
    }
  }
}

getExportQuoteJob

Description

Poll for the result of an exportQuote job.

If all line-item pricing has finished, the export is completed lazily and status changes to "completed" with the data populated.

Response

Returns an ExportQuoteJobResponse!

Arguments
Name Description
jobId - String!

Example

Query
query getExportQuoteJob($jobId: String!) {
  getExportQuoteJob(jobId: $jobId) {
    jobId
    status
    data {
      meta {
        schemaVersion
        generatedAt
        supplierName
      }
      kind
      currency
      quote {
        quoteNumber
        quoteDate
        expiryDate
        customerCompanyName
        mainPOCName
        mainPOCPhone
        mainPOCEmail
        notesAndTerms
        shipTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        billTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        subtotal {
          value
          formatted
          currency
        }
        total {
          value
          formatted
          currency
        }
        shipping {
          value
          formatted
          currency
        }
        tax {
          value
          formatted
          currency
        }
        lineItems {
          kind
          lineItemId
          lineNumber
          sku
          productId
          partNumber
          comments
          pricing {
            quantity
            unitPrice {
              ...MoneyFragment
            }
          }
          specs {
            industrySector
            ipcClassIII
            bareBoard {
              ...ExportBareBoardFragment
            }
            assemblyOptions {
              ...ExportAssemblyOptionsFragment
            }
            projectBom {
              ...ExportProjectBomItemFragment
            }
            stackup {
              ...ExportStackupLayerFragment
            }
            layerFileMapping {
              ...ExportLayerFileMappingFragment
            }
            padTraceData {
              ...ExportPadTraceDataFragment
            }
            drillData {
              ...ExportDrillDataFragment
            }
            fileNotes {
              ...ExportFileNoteFragment
            }
            fileTables {
              ...ExportFileTableFragment
            }
            provenance {
              ...ExportProvenanceFragment
            }
          }
          costing {
            scenarios {
              ...ExportCostingScenarioFragment
            }
          }
        }
      }
    }
    errors {
      ... on ErrorExportQuoteNotFound {
        code
        message
      }
      ... on ErrorExportSupplierNotFound {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorExportNotScopedConsumer {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"jobId": "abc123"}
Response
{
  "data": {
    "getExportQuoteJob": {
      "jobId": "xyz789",
      "status": "xyz789",
      "data": ExportQuote,
      "errors": [ErrorExportQuoteNotFound]
    }
  }
}

getExportQuoteLineItemJob

Description

Poll for the result of an exportQuoteLineItem job.

If pricing has finished, the export is completed lazily and status changes to "completed" with the data populated.

Response

Returns an ExportQuoteLineItemJobResponse!

Arguments
Name Description
jobId - String!

Example

Query
query getExportQuoteLineItemJob($jobId: String!) {
  getExportQuoteLineItemJob(jobId: $jobId) {
    jobId
    status
    data {
      meta {
        schemaVersion
        generatedAt
        supplierName
      }
      kind
      currency
      quote {
        quoteNumber
        quoteDate
        expiryDate
        customerCompanyName
        mainPOCName
        mainPOCPhone
        mainPOCEmail
        notesAndTerms
        shipTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        billTo {
          name
          address1
          address2
          city
          state
          zipCode
          country
        }
        subtotal {
          value
          formatted
          currency
        }
        total {
          value
          formatted
          currency
        }
        shipping {
          value
          formatted
          currency
        }
        tax {
          value
          formatted
          currency
        }
        lineItems {
          kind
          lineItemId
          lineNumber
          sku
          productId
          partNumber
          comments
          pricing {
            quantity
            unitPrice {
              ...MoneyFragment
            }
          }
          specs {
            industrySector
            ipcClassIII
            bareBoard {
              ...ExportBareBoardFragment
            }
            assemblyOptions {
              ...ExportAssemblyOptionsFragment
            }
            projectBom {
              ...ExportProjectBomItemFragment
            }
            stackup {
              ...ExportStackupLayerFragment
            }
            layerFileMapping {
              ...ExportLayerFileMappingFragment
            }
            padTraceData {
              ...ExportPadTraceDataFragment
            }
            drillData {
              ...ExportDrillDataFragment
            }
            fileNotes {
              ...ExportFileNoteFragment
            }
            fileTables {
              ...ExportFileTableFragment
            }
            provenance {
              ...ExportProvenanceFragment
            }
          }
          costing {
            scenarios {
              ...ExportCostingScenarioFragment
            }
          }
        }
      }
    }
    errors {
      ... on ErrorExportQuoteNotFound {
        code
        message
      }
      ... on ErrorExportLineItemNotFound {
        code
        message
      }
      ... on ErrorExportSupplierNotFound {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorExportNotScopedConsumer {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"jobId": "xyz789"}
Response
{
  "data": {
    "getExportQuoteLineItemJob": {
      "jobId": "xyz789",
      "status": "abc123",
      "data": ExportQuote,
      "errors": [ErrorExportQuoteNotFound]
    }
  }
}

getFileUploadPolicies

Description

Allows you to get write policies for the given files so that you can upload them to our Amazon S3 bucket then assign them to a project. Please remember the project needs to be created beforehand and is identified by the required argument projectId. Please refer to createProject if you have not completed this step before.

File structure

Please follow the recommendations in the section ProjectFile to learn more.

Archive support

You can upload .zip, .tar, .tar.gz, .rar, or .7z archives directly. The server extracts them asynchronously and adds the inner files to the project — no client-side decompression needed.

Type detection runs on extracted files: omit type and the server will classify each file (gerber / drill / BOM / ODB++ / other) the same way it does for files uploaded individually.

Limits per archive: 512 MB uncompressed, 500 inner files. Encrypted archives, .bz2, and other formats are rejected with a specific error. Per-file extraction errors surface via analyzeProject's warnings field — the rest of the archive still imports.

For ODB++ projects, you can upload either the ODB .tgz directly or a .zip containing the ODB tarball or the raw ODB folder structure — all three paths produce the same result.

Limits

At this time we have a limit of 500 policies than can be requested for a single project in a timeframe of 60 seconds. If you try to request more policies for a single project during the timeframe, you will be presented with an error message that looks as follows:

    {
        "data": {
            "getFileUploadPolicies": {
                "writePolicies": null,
                "errors": [
                    {
                        "code": "TOO_MANY_UPLOADS_FOR_PROJECT",
                        "message": "Please wait 58 seconds before uploading a new batch of files for this project."
                    }
                ]
            }
        }
    }
Response

Returns a WritePoliciesResponse!

Arguments
Name Description
files - [ProjectFile!]! An array of files you wish to upload for this project.
projectId - String! Your project id

Example

Query
query getFileUploadPolicies(
  $files: [ProjectFile!]!,
  $projectId: String!
) {
  getFileUploadPolicies(
    files: $files,
    projectId: $projectId
  ) {
    writePolicies {
      requestId
      policies {
        fileName
        filePath
        policy {
          method
          url
          fields
          headers
        }
      }
    }
    errors {
      ... on ErrorNoFiles {
        code
        message
      }
      ... on ErrorTooManyFiles {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorLimitExceeded {
        code
        message
        statusCode
      }
      ... on ErrorIncorrectFilePath {
        code
        message
      }
      ... on ErrorIncorrectFileName {
        code
        message
      }
      ... on ErrorEmptyFile {
        code
        message
      }
      ... on ErrorFileTypeNotSupported {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorTooManyUploadsProject {
        code
        message
      }
    }
  }
}
Variables
{
  "files": [ProjectFile],
  "projectId": "abc123"
}
Response
{
  "data": {
    "getFileUploadPolicies": {
      "writePolicies": WritePolicies,
      "errors": [ErrorNoFiles]
    }
  }
}

getManufacturers

Description

Allows you to retrieve a list of manufacturers available to you through our API. Use it to get information about their names, ids, PCBSalesCenter online e-commerce urls and if they are available to price PCB-only, Assembly-only or both kinds of jobs.

Response

Returns [GetManufacturersResponse!]!

Arguments
Name Description
types - [String!]

A string array of manufacturer types like ['EMS', 'PCB', 'BOTH']. In this context, each type refers to manufacturers that accept each type of job as defined:

  • PCB: PCB-only jobs
  • EMS: Assembly-only jobs
  • BOTH: PCB and Assembly jobs

This field is nullable so you may not define it in your request to retrieve all the results available.

ids - [Int!]

A numeric array of manufacturer ids like [123, 456, 789].

This field is nullable so you may not define it in your request to retrieve all the results available.

Example

Query
query getManufacturers(
  $types: [String!],
  $ids: [Int!]
) {
  getManufacturers(
    types: $types,
    ids: $ids
  ) {
    mfrId
    manufacturer {
      _id
      displayName
      type
      products
      pcbSaleCenterUrl
      pcbQuickUrl
      preferredCurrency
      logoUrl
      website
    }
    errors {
      ... on ErrorMfrNotFound {
        code
        message
      }
    }
  }
}
Variables
{"types": ["abc123"], "ids": [987]}
Response
{
  "data": {
    "getManufacturers": [
      {
        "mfrId": 987,
        "manufacturer": Manufacturer,
        "errors": [ErrorMfrNotFound]
      }
    ]
  }
}

getProject

Description

Allows you to retrieve information about a project identified by projectId.

Retrieving prices

Please follow the documentation of the Project type here and check the getPrices field.

Response

Returns a ProjectResponse!

Arguments
Name Description
projectId - String! Your project id

Example

Query
query getProject($projectId: String!) {
  getProject(projectId: $projectId) {
    project {
      _id
      creationSource
      apiConsumerId
      externalAccountId
      companyName
      name
      designerEmail
      creationDate
      lastModifiedDate
      boardFileType
      editorLink
      technicalDetails {
        version
        materialType
        materialTypeOtherText
        numberOfLayers
        solderMask
        solderMaskOtherText
        finishSurface
        finishSurfaceOtherText
        baseCuThicknessMM
        singlePCBWidthMM
        singlePCBLengthMM
        panelWidthMM
        panelLengthMM
        pcbPerPanel
        IPCClass
        industrySector
        viaPlug
        ctiValue
        materialTg
        peelableSolderMask
        controlledImpedance
      }
      getPrices {
        mfrId
        mfrDisplayName
        price {
          unitPrice
          subtotal
          quantity
          currency
          projectType
        }
        errors {
          ... on ErrorProjectNotFound {
            code
            message
          }
          ... on ErrorCannotPrice {
            code
            message
          }
          ... on ErrorQuoteRequired {
            code
            message
          }
          ... on ErrorPricingDisabled {
            code
            message
          }
          ... on ErrorPricingInProgress {
            code
            message
            retryAfterSeconds
          }
          ... on ErrorMfrNotFound {
            code
            message
          }
        }
      }
    }
    errors {
      ... on ErrorAccessDenied {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorLimitExceeded {
        code
        message
        statusCode
      }
    }
  }
}
Variables
{"projectId": "abc123"}
Response
{
  "data": {
    "getProject": {
      "project": Project,
      "errors": [ErrorAccessDenied]
    }
  }
}

getProjectPrices

Description

Use it to retrieve project prices for a project. You can specify an optional quantity and manufacturer ids. Please refer to getManufacturers to get more information about how you can retrieve the latter.

Quantity resolution

When quantity is omitted or null, the resolver now uses the project's persisted quantity (set by createProject) before falling back to the platform default of 10. Previously the resolver always defaulted to 10 when the argument was absent. To force the platform default, pass 10 explicitly.

Currencies and conversions

At the time, the prices returned match the preferred currencies of the manufacturers, so for example, if a manufacturer prefers to get paid in USD, the price object returned for this manufacturer in the results will be in USD.

After receiving the information, you may want to filter it in your application, so that you display the most relevant results to your application users.

Response

Returns [PriceResponse!]!

Arguments
Name Description
quantity - Int Falls back to the project's stored quantity, then 10.
manufacturerIds - [Int!]

A numeric array of manufacturer ids like [123, 456, 798].

This field is nullable so you may omit it in your request to retrieve all the results available.

projectId - String! Your project id

Example

Query
query getProjectPrices(
  $quantity: Int,
  $manufacturerIds: [Int!],
  $projectId: String!
) {
  getProjectPrices(
    quantity: $quantity,
    manufacturerIds: $manufacturerIds,
    projectId: $projectId
  ) {
    mfrId
    mfrDisplayName
    price {
      unitPrice
      subtotal
      quantity
      currency
      projectType
    }
    errors {
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorCannotPrice {
        code
        message
      }
      ... on ErrorQuoteRequired {
        code
        message
      }
      ... on ErrorPricingDisabled {
        code
        message
      }
      ... on ErrorPricingInProgress {
        code
        message
        retryAfterSeconds
      }
      ... on ErrorMfrNotFound {
        code
        message
      }
    }
  }
}
Variables
{
  "quantity": 123,
  "manufacturerIds": [987],
  "projectId": "xyz789"
}
Response
{
  "data": {
    "getProjectPrices": [
      {
        "mfrId": 123,
        "mfrDisplayName": "abc123",
        "price": Price,
        "errors": [ErrorProjectNotFound]
      }
    ]
  }
}

getProjectPricesAsync

Description

Retrieve project prices asynchronously. Kicks off a Temporal pricing workflow for each manufacturer and returns immediately. On a cache hit the price field is populated; on a cache miss a PRICING_IN_PROGRESS error is returned with a retryAfterSeconds hint.

Retry the query after the suggested interval to pick up the cached result.

Currencies and conversions

Prices are returned in each manufacturer's preferred currency.

Example

getProjectPricesAsync(projectId: "abc", quantity: 100) {
    mfrId
    mfrDisplayName
    price { unitPrice subtotal quantity currency projectType }
    errors { ...on ErrorPricingInProgress { code message retryAfterSeconds } }
}
Response

Returns [PriceResponse!]!

Arguments
Name Description
quantity - Int Defaults to 10
manufacturerIds - [Int!] A numeric array of manufacturer ids like [123, 456, 798]. Nullable — omit to retrieve all.
projectId - String! Your project id

Example

Query
query getProjectPricesAsync(
  $quantity: Int,
  $manufacturerIds: [Int!],
  $projectId: String!
) {
  getProjectPricesAsync(
    quantity: $quantity,
    manufacturerIds: $manufacturerIds,
    projectId: $projectId
  ) {
    mfrId
    mfrDisplayName
    price {
      unitPrice
      subtotal
      quantity
      currency
      projectType
    }
    errors {
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorCannotPrice {
        code
        message
      }
      ... on ErrorQuoteRequired {
        code
        message
      }
      ... on ErrorPricingDisabled {
        code
        message
      }
      ... on ErrorPricingInProgress {
        code
        message
        retryAfterSeconds
      }
      ... on ErrorMfrNotFound {
        code
        message
      }
    }
  }
}
Variables
{
  "quantity": 987,
  "manufacturerIds": [123],
  "projectId": "xyz789"
}
Response
{
  "data": {
    "getProjectPricesAsync": [
      {
        "mfrId": 123,
        "mfrDisplayName": "xyz789",
        "price": Price,
        "errors": [ErrorProjectNotFound]
      }
    ]
  }
}

getRFQ

Description

Poll for the status of a submitted RFQ.

After calling submitRFQ, call this query repeatedly until complete is true. At that point, quoteNumber and quoteLink will be populated with the ERP-assigned values.

Recommended polling interval: 1–2 seconds.

Response

Returns an GetRFQResponse!

Arguments
Name Description
quoteId - Int! The quote ID returned by submitRFQ.

Example

Query
query getRFQ($quoteId: Int!) {
  getRFQ(quoteId: $quoteId) {
    rfq {
      complete
      quoteNumber
      quoteLink
    }
    errors {
      ... on ErrorRFQNotFound {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"quoteId": 987}
Response
{
  "data": {
    "getRFQ": {
      "rfq": RFQStatus,
      "errors": [ErrorRFQNotFound]
    }
  }
}

getTokenUsage

Description

Returns token usage for the current API consumer's billing period. Defaults to the current month. Optionally pass year and month to query a specific period.

Response

Returns a TokenUsageResponse!

Arguments
Name Description
month - Int
year - Int

Example

Query
query getTokenUsage(
  $month: Int,
  $year: Int
) {
  getTokenUsage(
    month: $month,
    year: $year
  ) {
    data {
      totalTokens
      monthlyTokensIncluded
      billingPeriodStart
      billingPeriodEnd
      breakdown {
        projects
        copperLayers
        bomParsing
        projectPricing
        bomPricing
        designNotesAnalyzed
        dfm
      }
      tokenUsageHistory {
        productId
        action
        tokens
        date
      }
    }
    errors {
      ... on ErrorInvalidBillingPeriod {
        code
        message
      }
      ... on ErrorTokenUsageFetchFailed {
        code
        message
      }
    }
  }
}
Variables
{"month": 987, "year": 123}
Response
{
  "data": {
    "getTokenUsage": {
      "data": TokenUsageData,
      "errors": [ErrorInvalidBillingPeriod]
    }
  }
}

layerFileMap

Description

Returns the full gerber-file → PCB-layer mapping for a product: for each assigned layer file, its layer role, layer number (where applicable), and the assigned gerber file name. Covers copper, silk, mask, paste, drill, outline, and mechanical.

fileName is null when the file record is missing or unnamed (e.g. a legacy product). Returns null when the project is not accessible to this consumer, export functions are disabled, or the export mask excludes bareBoard. A product with no layer files returns an empty layers array.

This is the same mapping surfaced in the JSON export under specs.layerFileMapping.

Response

Returns a LayerFileMapResponse

Arguments
Name Description
productId - String!

Example

Query
query layerFileMap($productId: String!) {
  layerFileMap(productId: $productId) {
    layers {
      fileType
      layerName
      circuitBoardLayerNumber
      fileName
      maskArtwork
    }
  }
}
Variables
{"productId": "abc123"}
Response
{
  "data": {
    "layerFileMap": {"layers": [ExportLayerFileMapping]}
  }
}

layerMeshes

Description

Kick off (or return the existing job for) a per-layer 3D mesh export of a product's board — one binary glTF ("gltf") mesh per rendered board layer (copper, mask, silk) plus the synthesized board-core ("dielectric") layer.

Returns null when the project is not accessible to this consumer, export functions are disabled for this consumer, the export mask excludes bareBoard, or the project has no layer files yet (run analyzeProject first).

Poll retrieveAsset with assetExportJobId. When status is "completed", read layers — this assetType does not populate url/contentType.

Response

Returns an AssetExportJobReference

Arguments
Name Description
productId - String!

Example

Query
query layerMeshes($productId: String!) {
  layerMeshes(productId: $productId) {
    assetExportJobId
  }
}
Variables
{"productId": "abc123"}
Response
{
  "data": {
    "layerMeshes": {
      "assetExportJobId": "xyz789"
    }
  }
}

listProjects

Description

Lists projects visible to the authenticated API consumer, as id + display name. Use the returned projectIds with getProject to fetch full project details.

Scoping

  • Scoped manufacturer consumers with Full Domain Access see every project for their vendor (web-UI + API).
  • All other consumers see only projects they themselves created via the API.

Archived projects are excluded.

Sorting

sortBy selects the order:

  • creationDate (default) — newest-created first. Backwards-compatible default for existing callers.
  • lastModifiedDate — most-recently-touched first. Projects that have never been modified sort to the end.

Pagination

Page size is bounded server-side. The response includes nextCursor — an opaque token — that you pass back as after on the next call to continue. nextCursor: null means you reached the last page. Order is stable (sort field desc, _id desc tiebreaker) so a page boundary won't double-count or skip projects. Cursors are tied to the sortBy they were produced under; switching sortBy mid-pagination is undefined and the cursor should be discarded.

Response

Returns a ListProjectsResponse!

Arguments
Name Description
sortBy - String Sort field: "creationDate" (default) or "lastModifiedDate".
after - String Opaque cursor returned from a previous call. Omit on the first call.
first - Int Page size. Defaults to 100, capped at 500.

Example

Query
query listProjects(
  $sortBy: String,
  $after: String,
  $first: Int
) {
  listProjects(
    sortBy: $sortBy,
    after: $after,
    first: $first
  ) {
    projects {
      projectId
      name
    }
    nextCursor
    errors {
      ... on ErrorAccessDenied {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorLimitExceeded {
        code
        message
        statusCode
      }
    }
  }
}
Variables
{
  "sortBy": "abc123",
  "after": "abc123",
  "first": 987
}
Response
{
  "data": {
    "listProjects": {
      "projects": [ProjectListItem],
      "nextCursor": "xyz789",
      "errors": [ErrorAccessDenied]
    }
  }
}

retrieveAsset

Description

Poll for the result of an asset-export job. Asset jobs are kicked off by field resolvers like DfmResultEntry.image that return an assetExportJobId you pass here.

When status is "completed", url is a presigned S3 GET URL valid for ~1 hour. Re-poll to mint a fresh URL after expiry.

The layerMesh assetType (see layerMeshes) is the exception: it populates layers instead of url/contentType — one presigned mesh URL per rendered board layer.

Response

Returns an AssetExportJobResponse!

Arguments
Name Description
jobId - String!

Example

Query
query retrieveAsset($jobId: String!) {
  retrieveAsset(jobId: $jobId) {
    jobId
    status
    url
    contentType
    layers {
      fileType
      fileId
      format
      url
      contentType
      units
    }
    errors {
      ... on ErrorAssetFailed {
        code
        message
      }
      ... on ErrorAssetNotAvailable {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"jobId": "xyz789"}
Response
{
  "data": {
    "retrieveAsset": {
      "jobId": "abc123",
      "status": "xyz789",
      "url": "abc123",
      "contentType": "abc123",
      "layers": [LayerMeshAsset],
      "errors": [ErrorAssetFailed]
    }
  }
}

retrieveDFM

Description

Poll for the result of a getDFM job.

When the SpeedDFM run finishes, the job is completed lazily on the first poll that observes a complete result, and status flips to "completed" with data populated. Tokens are charged at this point — proportional to layer feature count. See getTokenUsage.

Response

Returns a DfmJobResponse!

Arguments
Name Description
jobId - String!

Example

Query
query retrieveDFM($jobId: String!) {
  retrieveDFM(jobId: $jobId) {
    jobId
    status
    data {
      results {
        ruleId
        ruleName
        ruleType
        severity
        layerName
        layerType
        x
        y
        measuredValue
        threshold
        unit
        description
        image {
          assetExportJobId
        }
      }
      summary {
        fabricationErrorCount
        fabricationWarningCount
        assemblyErrorCount
        assemblyWarningCount
        generalCount
        analysisStatus
      }
      reportUrl {
        assetExportJobId
      }
    }
    errors {
      ... on ErrorExportProductNotFound {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorAnalysisNotComplete {
        code
        message
      }
      ... on ErrorDfmFailed {
        code
        message
      }
      ... on ErrorDfmNotAvailable {
        code
        message
      }
      ... on ErrorExportFailed {
        code
        message
      }
      ... on ErrorJobNotFound {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"jobId": "abc123"}
Response
{
  "data": {
    "retrieveDFM": {
      "jobId": "abc123",
      "status": "abc123",
      "data": DfmResults,
      "errors": [ErrorExportProductNotFound]
    }
  }
}

schemaVersionSettings

Description

The consumer's JSON export schema-version override and the version exports currently resolve to.

Response

Returns a SchemaVersionSettings!

Example

Query
query schemaVersionSettings {
  schemaVersionSettings {
    override
    resolved
  }
}
Response
{
  "data": {
    "schemaVersionSettings": {
      "override": "abc123",
      "resolved": "abc123"
    }
  }
}

Mutations

analyzeProject

Description

Use this mutation to start processing a project every time you upload new files to our S3 bucket. This process will parse all the project information and BOM items so that you can retrieve the latest pricing.

This mutation is meant to be long polled, so you can call it, wait at least half a second, and then call it again to see if the process is completed. After some calls, the completed flag in the response will be set to true and at that moment you would be able to retrieve the latest pricing.

Skip flags (skipFileNoteExtraction, skipBomProcessing, skipPricing) are sticky — once set to true, they persist across subsequent calls for the same project unless you explicitly set them back to false.

Response

Returns a ProjectAnalysisResponse

Arguments
Name Description
skipPricing - Boolean Skip pricing to save tokens
skipBomProcessing - Boolean Skip BOM processing to save tokens
skipFileNoteExtraction - Boolean Skip file note extraction (PDF scanning) to save tokens
projectId - String! Your project id

Example

Query
mutation analyzeProject(
  $skipPricing: Boolean,
  $skipBomProcessing: Boolean,
  $skipFileNoteExtraction: Boolean,
  $projectId: String!
) {
  analyzeProject(
    skipPricing: $skipPricing,
    skipBomProcessing: $skipBomProcessing,
    skipFileNoteExtraction: $skipFileNoteExtraction,
    projectId: $projectId
  ) {
    analysis {
      complete
    }
    warnings {
      code
      message
    }
    errors {
      ... on ErrorAccessDenied {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorLimitExceeded {
        code
        message
        statusCode
      }
      ... on ErrorNoAnalyzableContent {
        code
        message
      }
      ... on ErrorProjectNotUpdated {
        code
        message
      }
    }
  }
}
Variables
{
  "skipPricing": false,
  "skipBomProcessing": true,
  "skipFileNoteExtraction": false,
  "projectId": "abc123"
}
Response
{
  "data": {
    "analyzeProject": {
      "analysis": ProjectFilesAnalysis,
      "warnings": [ApiWarning],
      "errors": [ErrorAccessDenied]
    }
  }
}

cancelAnalysis

Description

Cancel an in-flight analysis for a project. Sets a cancel flag that stops the background analysis pipeline at its next step boundary, so the project stops consuming token allowance. The project itself is retained (nothing is archived or deleted) and its analysis concurrency slot is released immediately.

Calling analyzeProject again clears the flag and resumes processing, so a cancelled project can always be re-analyzed later.

Response

Returns a ProjectAnalysisCancelResponse!

Arguments
Name Description
projectId - String! Your project id

Example

Query
mutation cancelAnalysis($projectId: String!) {
  cancelAnalysis(projectId: $projectId) {
    success
    errors {
      ... on ErrorProjectNotUpdated {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorInvalidProjectSuggestions {
        code
        message
      }
    }
  }
}
Variables
{"projectId": "xyz789"}
Response
{
  "data": {
    "cancelAnalysis": {
      "success": false,
      "errors": [ErrorProjectNotUpdated]
    }
  }
}

clearBom

Description

Clears the parsed BOM from a project so a corrected BOM file can be re-parsed.

Once a project has a parsed BOM, re-uploading a corrected file has no effect: a non-empty BOM disables re-parsing and the original file stays tagged as the BOM. Call this mutation to reset that state — it empties the parsed BOM and removes the "Bill Of Material" tag from the current BOM file, leaving all other files and data intact. After calling it, upload the corrected file and call analyzeProject to re-parse.

If the project had assembly explicitly disabled, that block is cleared so the corrected BOM can be parsed; assembly (withAssembly) is turned on automatically once a BOM successfully parses.

Provide the optional fileId to untag a specific file when more than one looks BOM-shaped; otherwise the file currently tagged as the BOM is used.

Response

Returns a ProjectUpdateResponse!

Arguments
Name Description
fileId - String Optional file id to untag as the BOM. Defaults to the file currently tagged "Bill Of Material".
projectId - String! Your project id

Example

Query
mutation clearBom(
  $fileId: String,
  $projectId: String!
) {
  clearBom(
    fileId: $fileId,
    projectId: $projectId
  ) {
    project {
      _id
    }
    errors {
      ... on ErrorProjectNotUpdated {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorInvalidProjectSuggestions {
        code
        message
      }
    }
  }
}
Variables
{
  "fileId": "xyz789",
  "projectId": "xyz789"
}
Response
{
  "data": {
    "clearBom": {
      "project": ProjectUpsert,
      "errors": [ErrorProjectNotUpdated]
    }
  }
}

createProject

Description

Allows you to create a project in our platform. Please make sure to call this mutation first, because you will need the _id returned by it to be able to upload files to the project or get pricing information.

ERP Account Integration

For API Consumers scoped to a specific manufacturer (vendorId), you can optionally provide:

  • externalAccountId (optional): ERP-specific account identifier from your downstream system
  • companyName (optional): Company name for new account creation

Both parameters are optional. If not provided, the system will use the manufacturer's default account behavior.

Response

Returns a ProjectCreationResponse!

Arguments
Name Description
quantity - Int Board quantity. Defaults to 10.
companyName - String Company name for new account creation (optional)
externalAccountId - String ERP-specific account identifier (optional)
designerEmail - String
name - String The name for your project

Example

Query
mutation createProject(
  $quantity: Int,
  $companyName: String,
  $externalAccountId: String,
  $designerEmail: String,
  $name: String
) {
  createProject(
    quantity: $quantity,
    companyName: $companyName,
    externalAccountId: $externalAccountId,
    designerEmail: $designerEmail,
    name: $name
  ) {
    project {
      _id
    }
    errors {
      ... on ErrorProjectNotCreated {
        code
        message
      }
      ... on ErrorLimitExceeded {
        code
        message
        statusCode
      }
      ... on ErrorInvalidExternalAccountId {
        code
        message
      }
    }
  }
}
Variables
{
  "quantity": 987,
  "companyName": "xyz789",
  "externalAccountId": "abc123",
  "designerEmail": "abc123",
  "name": "xyz789"
}
Response
{
  "data": {
    "createProject": {
      "project": ProjectUpsert,
      "errors": [ErrorProjectNotCreated]
    }
  }
}

deleteProject

Description

Archive (soft-delete) a project. Sets the project's archived flag to true — the project document is retained but hidden from designer and manufacturer dashboards, matching the behavior of clicking the delete icon on a project card in the UI. Subsequent queries scoped to active projects will no longer return this project, but getProject lookups by id continue to work.

Inverse: restoreProject.

Response

Returns a ProjectDeletionResponse!

Arguments
Name Description
projectId - String! Your project id

Example

Query
mutation deleteProject($projectId: String!) {
  deleteProject(projectId: $projectId) {
    success
    errors {
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorProjectNotDeleted {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
    }
  }
}
Variables
{"projectId": "abc123"}
Response
{
  "data": {
    "deleteProject": {
      "success": true,
      "errors": [ErrorProjectNotFound]
    }
  }
}

openProject

Description

Call this mutation in order to create a token that will allow you to open our Pricing Display, as shown in the first section of this document, here.

Response

Returns an OpenProjectResponse!

Arguments
Name Description
manufacturerId - Int!
projectId - String! Your project id

Example

Query
mutation openProject(
  $manufacturerId: Int!,
  $projectId: String!
) {
  openProject(
    manufacturerId: $manufacturerId,
    projectId: $projectId
  ) {
    token
    errors {
      ... on ErrorAccessDenied {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorLimitExceeded {
        code
        message
        statusCode
      }
    }
  }
}
Variables
{
  "manufacturerId": 987,
  "projectId": "abc123"
}
Response
{
  "data": {
    "openProject": {
      "token": "xyz789",
      "errors": [ErrorAccessDenied]
    }
  }
}

restoreProject

Description

Restore a previously deleted (archived) project. Sets the project's archived flag to false, making it visible again on designer and manufacturer dashboards.

Inverse: deleteProject.

Response

Returns a ProjectRestoreResponse!

Arguments
Name Description
projectId - String! Your project id

Example

Query
mutation restoreProject($projectId: String!) {
  restoreProject(projectId: $projectId) {
    success
    errors {
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorProjectNotRestored {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
    }
  }
}
Variables
{"projectId": "abc123"}
Response
{
  "data": {
    "restoreProject": {
      "success": true,
      "errors": [ErrorProjectNotFound]
    }
  }
}

setSchemaVersion

Description

Pin the consumer's JSON export schema version. Rejects versions outside the supported set.

Response

Returns a SchemaVersionSettings!

Arguments
Name Description
version - String!

Example

Query
mutation setSchemaVersion($version: String!) {
  setSchemaVersion(version: $version) {
    override
    resolved
  }
}
Variables
{"version": "xyz789"}
Response
{
  "data": {
    "setSchemaVersion": {
      "override": "xyz789",
      "resolved": "abc123"
    }
  }
}

submitProjectSuggestions

Description

Submit suggestions for a project's bare board attributes. This allows API consumers to suggest changes to project properties using the suggestions framework, which provides traceability, confidence levels, and safer collaborative editing.

IMPORTANT: Only suggestions with confidence: 100 are automatically applied to the project. Suggestions with confidence < 100 are stored but NOT applied.

Allowed Fields

Only the following bare board fields can be suggested:

Field Type Valid Options
materialType String "FR-4 Fiberglass", "PTFE (Teflon)", "Aluminum-Core IMS", "Polyimide (PI / Kapton)", "Other" (requires otherText), plus Rogers, ceramic, and other specialty laminates. See MaterialTypeOptions for the full list.
numberOfLayers String (Int) Positive integer (≥ 1)
solderMask String "Green", "Blue", "Black", "Yellow", "Red", "Purple", "White", "LED White", "Clear", "None", "Other" (requires otherText)
finishSurface String "HASL Lead Free", "HASL Leaded", "Gold (ENIG)", "Immersion Tin", "Immersion Silver", "OSP Surface", "ENEPIG", "Other" (requires otherText)
baseCuThicknessMM String (Float) Positive number in MM (> 0), decimals allowed. Converted to closest standard oz value (0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9 oz)
singlePCBWidthMM String (Int) Positive integer (> 0), no decimals
singlePCBLengthMM String (Int) Positive integer (> 0), no decimals
panelWidthMM String (Int) Positive integer (> 0), no decimals
panelLengthMM String (Int) Positive integer (> 0), no decimals
pcbPerPanel String (Int) Positive integer (≥ 1)
IPCClass String (Int) "2" (Class II), "3" (Class III)
industrySector String "Unknown", "Automotive", "Automotive Safety", "Aerospace", "Aviation", "Defense", "Medical", "Industrial", "Consumer Electronics", "Information Technology", "White Goods"
viaPlug String "None", "Type I Tent", "Type II Tent & Cover", "Type III Plug", "Type IV Plug & Cover", "Type V Fill Epoxy", "Type VI Fill & Cover Epoxy", "Type VII Fill & Cap Epoxy", "Type VII Fill & Cap Copper", "Solder Mask Plug & Cover"
ctiValue String "PLC 0 (CTI >= 600V)", "PLC 1 (CTI >= 400V)", "PLC 2 (CTI >= 250V)", "PLC 3 (CTI >= 175V)"
materialTg String "110°C", "130°C", "140°C", "150°C", "170°C", "180°C", "210°C", "250°C", "280°C+"
peelableSolderMask String (Bool) "true" or "false"
controlledImpedance String (Bool) "true" or "false"

Note: Enabling controlledImpedance adds a pricing surcharge and can extend the board's lead time.

Example Usage

mutation SubmitProjectSuggestions(
  $projectId: String!,
  $changes: [ProjectSuggestionChangeInput!]!
) {
  submitProjectSuggestions(
    projectId: $projectId,
    changes: $changes
  ) {
    success
    message
    errors {
      code
      message
    }
  }
}

With variables:

{
  "projectId": "your-project-id",
  "changes": [
    {
      "property": "materialType",
      "value": "FR-4 Fiberglass",
      "confidence": 100
    },
    {
      "property": "finishSurface",
      "value": "Other",
      "otherText": "Custom Nickel-Palladium",
      "confidence": 100
    },
    {
      "property": "numberOfLayers",
      "value": "4",
      "confidence": 100
    }
  ]
}

Error Response Format

Single Validation Error:

{
  "errors": [
    {
      "message": "solderMask: Invalid value for the specified property."
    }
  ]
}

Multiple Validation Errors:

{
  "errors": [
    {
      "message": "solderMask: Invalid value; materialType: Invalid value; numberOfLayers: Must be between 1 and 32."
    }
  ]
}

"Other" Write-in Values

For materialType, solderMask, and finishSurface, you can set the value to "Other" and provide an otherText field (2–50 characters) with the write-in description. The otherText field is required when the value is "Other" and must not be provided otherwise.

Notes

  • Confidence defaults to 100 if not provided
  • Invalid field values will be rejected with descriptive error messages
  • Suggested values may take up to 10 seconds to be reflected on the product. A successful response confirms the suggestions were accepted, not that they have been applied yet - poll getProject until the suggested values appear before relying on them.
Response

Returns a ProjectSuggestionsResponse!

Arguments
Name Description
changes - [ProjectSuggestionChangeInput!]!
projectId - String!

Example

Query
mutation submitProjectSuggestions(
  $changes: [ProjectSuggestionChangeInput!]!,
  $projectId: String!
) {
  submitProjectSuggestions(
    changes: $changes,
    projectId: $projectId
  ) {
    success
    message
    errors {
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorInvalidProjectSuggestions {
        code
        message
      }
    }
  }
}
Variables
{
  "changes": [ProjectSuggestionChangeInput],
  "projectId": "xyz789"
}
Response
{
  "data": {
    "submitProjectSuggestions": {
      "success": true,
      "message": "abc123",
      "errors": [ErrorProjectNotFound]
    }
  }
}

submitRFQ

Description

Submit an RFQ (Request for Quote) on behalf of a designer account.

This mutation is only available to scoped API Consumers and will fail if the target project belongs to the API consumer's own account.

Once submitted, the quote will be created in a Pending state. Use getRFQ to poll for the ERP-assigned quote number, which becomes available after the ERP system processes the quote.

Country of Origin

Pass the human-readable country name, e.g. "China", "United States", "Canada", "Any".

Lead Time

Valid values: "Standard", "Rush", "Backordered".

Response

Returns an SubmitRFQResponse!

Arguments
Name Description
input - SubmitRFQInput!

Example

Query
mutation submitRFQ($input: SubmitRFQInput!) {
  submitRFQ(input: $input) {
    result {
      quoteId
    }
    errors {
      ... on ErrorRFQNotCreated {
        code
        message
      }
      ... on ErrorInvalidCountryOfOrigin {
        code
        message
      }
      ... on ErrorInvalidAddress {
        code
        message
      }
      ... on ErrorNotScopedConsumer {
        code
        message
      }
      ... on ErrorSelfQuotingNotAllowed {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorAccessDenied {
        code
        message
      }
    }
  }
}
Variables
{"input": SubmitRFQInput}
Response
{
  "data": {
    "submitRFQ": {
      "result": SubmitRFQResult,
      "errors": [ErrorRFQNotCreated]
    }
  }
}

updateProject

Description

Use this mutation to update a project in our platform. At the time being, you can define the user (designer) email if you have it and name the project.

If you are looking to how upload files to your project, please refer to getFileUploadPolicies.

If you already have files in your project and want our platform to process it, please refer to analyzeProject.

The data region is automatically determined during project creation using the API consumer's data region, if none is defined, it defaults to North America (NA).

Response

Returns a ProjectUpdateResponse!

Arguments
Name Description
designerEmail - String
name - String The name for your project
projectId - String! Your project id

Example

Query
mutation updateProject(
  $designerEmail: String,
  $name: String,
  $projectId: String!
) {
  updateProject(
    designerEmail: $designerEmail,
    name: $name,
    projectId: $projectId
  ) {
    project {
      _id
    }
    errors {
      ... on ErrorProjectNotUpdated {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorInvalidProjectSuggestions {
        code
        message
      }
    }
  }
}
Variables
{
  "designerEmail": "abc123",
  "name": "abc123",
  "projectId": "abc123"
}
Response
{
  "data": {
    "updateProject": {
      "project": ProjectUpsert,
      "errors": [ErrorProjectNotUpdated]
    }
  }
}

uploadFilesFromURLs

Description

This mutation is an alternative way to upload files to our servers by giving us urls and paths.

We will retrieve your files using a GET request and then upload them to our servers. For this reason, please make sure the urls given are publicly accessible.

Response

Returns an UploadFilesWithURLsResponse!

Arguments
Name Description
files - [FileToUploadWithURL!]! The array of files and paths to upload
projectId - String! Your project id

Example

Query
mutation uploadFilesFromURLs(
  $files: [FileToUploadWithURL!]!,
  $projectId: String!
) {
  uploadFilesFromURLs(
    files: $files,
    projectId: $projectId
  ) {
    ok
    errors {
      ... on ErrorNoFiles {
        code
        message
      }
      ... on ErrorTooManyFiles {
        code
        message
      }
      ... on ErrorMissingProjectId {
        code
        message
      }
      ... on ErrorLimitExceeded {
        code
        message
        statusCode
      }
      ... on ErrorIncorrectFilePath {
        code
        message
      }
      ... on ErrorIncorrectFileName {
        code
        message
      }
      ... on ErrorEmptyFile {
        code
        message
      }
      ... on ErrorFileTypeNotSupported {
        code
        message
      }
      ... on ErrorProjectNotFound {
        code
        message
      }
      ... on ErrorTooManyUploadsProject {
        code
        message
      }
      ... on ErrorFileMissingURL {
        code
        message
      }
      ... on ErrorInvalidURL {
        code
        message
      }
      ... on ErrorUploadError {
        code
        message
      }
    }
  }
}
Variables
{
  "files": [FileToUploadWithURL],
  "projectId": "xyz789"
}
Response
{
  "data": {
    "uploadFilesFromURLs": {
      "ok": false,
      "errors": [ErrorNoFiles]
    }
  }
}

Types

ApiWarning

Description

Non-fatal informational warning about the processed result

Fields
Field Name Description
code - String! Machine-readable warning code
message - String! Human-readable warning message
Example
{
  "code": "abc123",
  "message": "abc123"
}

AssetExportJobReference

Description

A handle to an asset-export job kicked off by a field resolver. Pass jobId to retrieveAsset to fetch the result.

Fields
Field Name Description
assetExportJobId - String!
Example
{"assetExportJobId": "xyz789"}

AssetExportJobResponse

Description

Polled status of an asset-export job. When status is "completed", url is a presigned S3 GET url valid for ~1 hour — except for the layerMesh assetType, which populates layers instead (see its field description).

Fields
Field Name Description
jobId - String!
status - String! "processing" while the asset is still being generated, "completed" when ready, "failed" on error.
url - String Presigned S3 GET URL for the asset. Null until status is "completed", and always null for the layerMesh assetType (see layers). Expires after ~1 hour; re-poll retrieveAsset to mint a fresh URL.
contentType - String MIME type of the asset (e.g. "image/png"). Null until status is "completed", and always null for the layerMesh assetType (see layers).
layers - [LayerMeshAsset!] Populated instead of url/contentType when this job's assetType is layerMesh: one entry per rendered board layer. Null until status is "completed", and null for every other assetType.
errors - [ErrorListAssetExportJob!]!
Example
{
  "jobId": "abc123",
  "status": "xyz789",
  "url": "xyz789",
  "contentType": "abc123",
  "layers": [LayerMeshAsset],
  "errors": [ErrorAssetFailed]
}

Boolean

Description

The Boolean scalar type represents true or false.

DateTime

Description

The javascript Date as string. Type represents date and time as the ISO Date string.

Example
"2007-12-03T10:15:30Z"

DfmAnalysisStatus

Description

Status of the SpeedDFM analysis for a project.

Values
Enum Value Description

complete

processing

not_run

Example
"complete"

DfmJobResponse

Fields
Field Name Description
jobId - String!
status - String! "processing" while DFM is still running, "completed" once results are ready, "failed" on error.
data - DfmResults DFM analysis results. Null while status is "processing" or "failed".
errors - [ErrorListDfmJob!]!
Example
{
  "jobId": "abc123",
  "status": "abc123",
  "data": DfmResults,
  "errors": [ErrorExportProductNotFound]
}

DfmResultEntry

Description

A single DFM violation with location and rule details.

Fields
Field Name Description
ruleId - String! Machine-readable identifier for the DFM rule (e.g. min_trace_width).
ruleName - String! Human-readable rule name (e.g. "Minimum Trace Width").
ruleType - DfmRuleType! Whether this rule pertains to PCB fabrication, assembly, or is general.
severity - DfmSeverity! Severity of this violation.
layerName - String User's original uploaded filename for the layer (e.g. MyBoard.GTL).
layerType - String File type for the source layer (e.g. "topCopper", "bottomMask").
x - Float X coordinate of the violation in mm, relative to board origin.
y - Float Y coordinate of the violation in mm, relative to board origin.
measuredValue - Float Measured value that triggered the violation (e.g. 0.08).
threshold - Float Rule threshold that was violated (e.g. 0.10).
unit - String! Unit of measurement. Always "mm".
description - String! Brief human-readable description of the specific violation.
image - AssetExportJobReference

Async kick-off of a composite image render centered on this violation's (x, y). Returns a job reference; poll retrieveAsset with assetExportJobId to fetch the rendered PNG when ready.

Returns null when the violation has no usable coordinates (geometry-less rules).

The rendered tile is a stack of the project's PCB layers in canonical colors, cropped to a widthMm × heightMm square centered on the violation, with a small magenta crosshair marking the exact (x, y).

Arguments
heightMm - Float

Tile height in mm. Default 10mm. Must be > 0 and ≤ 200mm; out-of-range returns null.

widthMm - Float

Tile width in mm. Default 10mm. Must be > 0 and ≤ 200mm; out-of-range returns null.

Example
{
  "ruleId": "xyz789",
  "ruleName": "xyz789",
  "ruleType": "fabrication",
  "severity": "error",
  "layerName": "xyz789",
  "layerType": "xyz789",
  "x": 123.45,
  "y": 123.45,
  "measuredValue": 123.45,
  "threshold": 987.65,
  "unit": "abc123",
  "description": "xyz789",
  "image": AssetExportJobReference
}

DfmResults

Description

SpeedDFM analysis results. Each entry carries a ruleType to indicate fabrication, assembly, or general scope.

Fields
Field Name Description
results - [DfmResultEntry!]! All DFM violations. Filter by entry.ruleType to separate fabrication, assembly, and general results.
summary - DfmSummary!
reportUrl - AssetExportJobReference

Async kick-off of a PDF DFM report covering every violation. Returns a job reference; poll retrieveAsset with assetExportJobId to fetch the rendered PDF when ready.

The PDF is cached server-side keyed by the DFM run's deterministic dfmId, so asking twice for the same project + config combination returns the same artifact instantly on the second call.

Returns null when productId/dfmId aren't available (analysis hasn't completed).

Example
{
  "results": [DfmResultEntry],
  "summary": DfmSummary,
  "reportUrl": AssetExportJobReference
}

DfmRuleType

Description

Category of DFM rule: fabrication, assembly, or general.

Values
Enum Value Description

fabrication

assembly

general

Example
"fabrication"

DfmSeverity

Description

Severity level of a DFM violation.

Values
Enum Value Description

error

warning

info

Example
"error"

DfmSummary

Description

Aggregate counts and analysis status for the DFM results.

Fields
Field Name Description
fabricationErrorCount - Int!
fabricationWarningCount - Int!
assemblyErrorCount - Int!
assemblyWarningCount - Int!
generalCount - Int!
analysisStatus - DfmAnalysisStatus!
Example
{
  "fabricationErrorCount": 987,
  "fabricationWarningCount": 123,
  "assemblyErrorCount": 123,
  "assemblyWarningCount": 987,
  "generalCount": 987,
  "analysisStatus": "complete"
}

ErrorAccessDenied

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorAnalysisNotComplete

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "abc123"
}

ErrorAssetFailed

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorAssetNotAvailable

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorCannotPrice

Description

Some other pricing error occurred during this request and the manufacturer will not be able to price the project.

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorDfmFailed

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorDfmNotAvailable

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "abc123"
}

ErrorEmptyFile

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorExportFailed

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorExportInvalidQuantity

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorExportLineItemNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorExportNotScopedConsumer

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorExportProductNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorExportQuoteNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorExportSupplierNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorFileMissingURL

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "abc123"
}

ErrorFileTypeNotSupported

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "abc123"
}

ErrorIncorrectFileName

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorIncorrectFilePath

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorInvalidAddress

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorInvalidBillingPeriod

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "abc123"
}

ErrorInvalidCountryOfOrigin

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorInvalidExternalAccountId

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorInvalidProjectSuggestions

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorInvalidURL

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorJobNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorLimitExceeded

Fields
Field Name Description
code - String!
message - String
statusCode - Int!
Example
{
  "code": "abc123",
  "message": "abc123",
  "statusCode": 987
}

ErrorListAnalyzeProject

ErrorListAssetExportJob

Example
ErrorAssetFailed

ErrorListCreateProject

Example
ErrorProjectNotCreated

ErrorListDeleteProject

Example
ErrorProjectNotFound

ErrorListDfmJob

ErrorListExportProductJob

ErrorListExportQuoteJob

ErrorListExportQuoteLineItemJob

ErrorListGetFileUploadPolicies

ErrorListGetManufacturers

Types
Union Types

ErrorMfrNotFound

Example
ErrorMfrNotFound

ErrorListGetProject

ErrorListGetProjectPrices

ErrorListGetRFQ

Example
ErrorRFQNotFound

ErrorListGetTokenUsage

Example
ErrorInvalidBillingPeriod

ErrorListProjectSuggestions

Example
ErrorProjectNotFound

ErrorListRestoreProject

Example
ErrorProjectNotFound

ErrorListSubmitRFQ

ErrorListUpdateProject

ErrorListUploadFilesWithURLs

ErrorMfrNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorMissingProjectId

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorNoAnalyzableContent

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorNoFiles

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "abc123"
}

ErrorNotScopedConsumer

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorPricingDisabled

Description

Pricing has been disabled for this project via the skipPricing processing flag.

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorPricingInProgress

Description

Pricing is being calculated asynchronously. Retry the request after the suggested interval. The pricing workflow has been started and the result will be cached once complete.

Fields
Field Name Description
code - String!
message - String
retryAfterSeconds - Int! Suggested number of seconds to wait before retrying.
Example
{
  "code": "xyz789",
  "message": "abc123",
  "retryAfterSeconds": 987
}

ErrorProjectNotCreated

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorProjectNotDeleted

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorProjectNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorProjectNotRestored

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorProjectNotUpdated

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorQuoteRequired

Description

Some manufacturers in our platform will have configured values for which they require a quote, instead of comitting to a certain price. This scenario may be triggered if you are requesting quotes for a quantity larger than 9999, or if the manufacturer prefers to quote after certain number of layers, board thickness, finishing, materials or others.

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorRFQNotCreated

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorRFQNotFound

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorSelfQuotingNotAllowed

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ErrorTokenUsageFetchFailed

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorTooManyFiles

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "abc123",
  "message": "xyz789"
}

ErrorTooManyUploadsProject

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "abc123"
}

ErrorUploadError

Fields
Field Name Description
code - String!
message - String
Example
{
  "code": "xyz789",
  "message": "xyz789"
}

ExportAddress

Fields
Field Name Description
name - String
address1 - String
address2 - String
city - String
state - String
zipCode - String
country - String
Example
{
  "name": "abc123",
  "address1": "abc123",
  "address2": "abc123",
  "city": "abc123",
  "state": "abc123",
  "zipCode": "xyz789",
  "country": "abc123"
}

ExportAssemblyOptions

Fields
Field Name Description
conformalCoating - Boolean
functionalTesting - Boolean
xRayInspection - Boolean
firstArticleInspection - Boolean
bedOfNailsTesting - Boolean
inBoardProgramming - Boolean
automatedOpticalInspection - Boolean
other - Boolean
otherText - String
Example
{
  "conformalCoating": false,
  "functionalTesting": true,
  "xRayInspection": true,
  "firstArticleInspection": true,
  "bedOfNailsTesting": true,
  "inBoardProgramming": false,
  "automatedOpticalInspection": true,
  "other": false,
  "otherText": "xyz789"
}

ExportAssemblyPlacementIssue

Fields
Field Name Description
refDes - String!
issue - String!
Example
{
  "refDes": "abc123",
  "issue": "abc123"
}

ExportAssemblySubstitution

Fields
Field Name Description
primaryPartNumber - String!
subPartNumber - String!
refDes - String!
Example
{
  "primaryPartNumber": "xyz789",
  "subPartNumber": "xyz789",
  "refDes": "xyz789"
}

ExportBareBoard

Fields
Field Name Description
customerSupplied - Boolean
hasLayerFiles - Boolean
boardThickness - ExportValueWithUnit
numOfLayers - Int
boardWidth - ExportValueWithUnit
boardLength - ExportValueWithUnit
copperThickness - ExportValueWithUnit
layersCuThickness - ExportTextWithUnit
material - String
materialOtherText - String
finishing - String
finishingOtherText - String
hdi - Boolean
controlledDepthDrilling - Boolean
goldFingers - Boolean
customStackup - Boolean
viaPlugging - String
solderMaskColor - String
solderMaskColorOtherText - String
silkscreenColor - String
silkscreenColorOtherText - String
layerFilesNotRequired - [String!]
electricalTesting - Boolean
controlledImpedance - Boolean
blindAndBuriedVias - Boolean
panel - ExportPanel
Example
{
  "customerSupplied": true,
  "hasLayerFiles": false,
  "boardThickness": ExportValueWithUnit,
  "numOfLayers": 123,
  "boardWidth": ExportValueWithUnit,
  "boardLength": ExportValueWithUnit,
  "copperThickness": ExportValueWithUnit,
  "layersCuThickness": ExportTextWithUnit,
  "material": "xyz789",
  "materialOtherText": "abc123",
  "finishing": "xyz789",
  "finishingOtherText": "abc123",
  "hdi": false,
  "controlledDepthDrilling": true,
  "goldFingers": false,
  "customStackup": true,
  "viaPlugging": "xyz789",
  "solderMaskColor": "xyz789",
  "solderMaskColorOtherText": "abc123",
  "silkscreenColor": "abc123",
  "silkscreenColorOtherText": "xyz789",
  "layerFilesNotRequired": ["xyz789"],
  "electricalTesting": true,
  "controlledImpedance": false,
  "blindAndBuriedVias": true,
  "panel": ExportPanel
}

ExportBareBoardValidationIssue

Fields
Field Name Description
factor - String!
note - String!
Example
{
  "factor": "xyz789",
  "note": "xyz789"
}

ExportBomAdditionalDetails

Fields
Field Name Description
source_id - String
source_name - String
id - String
purchase_quant - Float
unit_price - Money
total_price - Money
landed_price - Money
part_quote_id - String
is_backordered - Boolean
is_uncertain_lead - Boolean
expected_ships_in - Float
expected_transit_time - Float
best_case_lead - Float
returnable_until - String
release_deadline - String
package - String
availability - ExportBomAvailability
Example
{
  "source_id": "abc123",
  "source_name": "xyz789",
  "id": "xyz789",
  "purchase_quant": 123.45,
  "unit_price": Money,
  "total_price": Money,
  "landed_price": Money,
  "part_quote_id": "xyz789",
  "is_backordered": false,
  "is_uncertain_lead": false,
  "expected_ships_in": 987.65,
  "expected_transit_time": 987.65,
  "best_case_lead": 987.65,
  "returnable_until": "xyz789",
  "release_deadline": "xyz789",
  "package": "xyz789",
  "availability": ExportBomAvailability
}

ExportBomAvailability

Fields
Field Name Description
availability_type - String
stock - Float
lead - Float
multiple - Float
moq - Float
Example
{
  "availability_type": "abc123",
  "stock": 987.65,
  "lead": 987.65,
  "multiple": 987.65,
  "moq": 987.65
}

ExportBomIssuesByPartNumber

Fields
Field Name Description
partNumber - String!
error - [String!]
warning - [String!]
info - [String!]
Example
{
  "partNumber": "xyz789",
  "error": ["abc123"],
  "warning": ["abc123"],
  "info": ["abc123"]
}

ExportBomRefDesByPartNumber

Fields
Field Name Description
partNumber - String!
referenceDesignators - String!
Example
{
  "partNumber": "abc123",
  "referenceDesignators": "xyz789"
}

ExportBomValidationSeverityCounts

Fields
Field Name Description
success - Int!
warning - Int!
error - Int!
Example
{"success": 987, "warning": 987, "error": 987}

ExportBomValidationSeverityMessages

Fields
Field Name Description
success - [String!]!
warning - [String!]!
error - [String!]!
Example
{
  "success": ["abc123"],
  "warning": ["abc123"],
  "error": ["xyz789"]
}

ExportBomValidationSummary

Fields
Field Name Description
bomItemCount - Int!
countsBySeverity - ExportBomValidationSeverityCounts!
uniqueMessagesBySeverity - ExportBomValidationSeverityMessages!
issuesMapByPartNumber - [ExportBomIssuesByPartNumber!]!
issueReferenceDesignatorsMapByPartNumber - [ExportBomRefDesByPartNumber!]!
Example
{
  "bomItemCount": 987,
  "countsBySeverity": ExportBomValidationSeverityCounts,
  "uniqueMessagesBySeverity": ExportBomValidationSeverityMessages,
  "issuesMapByPartNumber": [ExportBomIssuesByPartNumber],
  "issueReferenceDesignatorsMapByPartNumber": [
    ExportBomRefDesByPartNumber
  ]
}

ExportCostingScenario

Fields
Field Name Description
id - String!
name - String!
quantity - Int!
buildTime - String!
panelizeBoards - Boolean!
countryOfOrigin - String
pricingLineItems - [ExportPricingLineItem!]!
projectCalculations - [ExportProjectCalculation!]!
calculations - [ExportPricingCalculation!]! Superseded by projectCalculations; will be removed in a future schema version.
assemblyUnitPrice - Money
profitProjections - [ProfitProjection!]
validationDetails - ExportProjectValidationDetails
subtotal - Float
unitPrice - Float
pcbSubtotal - Float
assemblySubtotal - Float
bomSubtotal - Float
Example
{
  "id": "abc123",
  "name": "xyz789",
  "quantity": 987,
  "buildTime": "xyz789",
  "panelizeBoards": true,
  "countryOfOrigin": "abc123",
  "pricingLineItems": [ExportPricingLineItem],
  "projectCalculations": [ExportProjectCalculation],
  "calculations": [ExportPricingCalculation],
  "assemblyUnitPrice": Money,
  "profitProjections": [ProfitProjection],
  "validationDetails": ExportProjectValidationDetails,
  "subtotal": 123.45,
  "unitPrice": 987.65,
  "pcbSubtotal": 123.45,
  "assemblySubtotal": 123.45,
  "bomSubtotal": 123.45
}

ExportDrillData

Fields
Field Name Description
drillFiles - [ExportDrillFileSummary!]!
totalHoleCount - Int!
holeDensity - ExportValueWithUnit
throughHoleCount - Int!
slotCount - Int!
backDrillCount - Int!
microViaCount - Int!
blindBuriedCount - Int!
mountingCount - Int!
unknownDrillCount - Int!
Example
{
  "drillFiles": [ExportDrillFileSummary],
  "totalHoleCount": 123,
  "holeDensity": ExportValueWithUnit,
  "throughHoleCount": 123,
  "slotCount": 123,
  "backDrillCount": 987,
  "microViaCount": 987,
  "blindBuriedCount": 987,
  "mountingCount": 987,
  "unknownDrillCount": 987
}

ExportDrillFileSummary

Fields
Field Name Description
drillDescription - String!
fileName - String!
holeCount - Int!
minHoleDiameter - ExportValueWithUnit
maxHoleDiameter - ExportValueWithUnit
totalHoleSurfaceArea - ExportValueWithUnit
drillKind - String
Example
{
  "drillDescription": "abc123",
  "fileName": "abc123",
  "holeCount": 987,
  "minHoleDiameter": ExportValueWithUnit,
  "maxHoleDiameter": ExportValueWithUnit,
  "totalHoleSurfaceArea": ExportValueWithUnit,
  "drillKind": "xyz789"
}

ExportFileNote

Fields
Field Name Description
text - String!
cleanedText - String
foundIn - [ExportFileNoteFoundIn!]!
Example
{
  "text": "xyz789",
  "cleanedText": "abc123",
  "foundIn": [ExportFileNoteFoundIn]
}

ExportFileNoteFoundIn

Fields
Field Name Description
fileName - String!
Example
{"fileName": "abc123"}

ExportFileTable

Fields
Field Name Description
table - [String!]!
foundIn - [ExportFileNoteFoundIn!]!
Example
{
  "table": ["abc123"],
  "foundIn": [ExportFileNoteFoundIn]
}

ExportLayerFileMapping

Fields
Field Name Description
fileType - String! Layer role, e.g. topCopper, topSilk, drillFile, outline, mechanical.
layerName - String! Human-readable layer label, e.g. top copper.
circuitBoardLayerNumber - Int Board layer number, where applicable (internal copper layers).
fileName - String Assigned gerber file name; null when the file record is missing or unnamed (e.g. a legacy product).
maskArtwork - String Solder-mask files only: non-standard artwork convention. inverted — the artwork draws the mask coverage rather than the standard openings. flooded — a standard openings artwork contaminated by a painted flood; openings are taken from the flashed data only. Absent means the standard negative convention (drawn = openings).
Example
{
  "fileType": "xyz789",
  "layerName": "xyz789",
  "circuitBoardLayerNumber": 987,
  "fileName": "abc123",
  "maskArtwork": "xyz789"
}

ExportLayerPadTraceSummary

Fields
Field Name Description
layerName - String!
fileName - String!
circularPadCount - Int!
rectangularPadCount - Int!
totalPadCount - Int!
minPadSurfaceArea - ExportValueWithUnit
maxPadSurfaceArea - ExportValueWithUnit
totalPadSurfaceArea - ExportValueWithUnit
traceCount - Int!
minTraceWidth - ExportValueWithUnit
maxTraceWidth - ExportValueWithUnit
uniqueTraceWidths - Int!
minSpacing - ExportValueWithUnit
copperArea - ExportValueWithUnit
Example
{
  "layerName": "abc123",
  "fileName": "abc123",
  "circularPadCount": 123,
  "rectangularPadCount": 123,
  "totalPadCount": 123,
  "minPadSurfaceArea": ExportValueWithUnit,
  "maxPadSurfaceArea": ExportValueWithUnit,
  "totalPadSurfaceArea": ExportValueWithUnit,
  "traceCount": 987,
  "minTraceWidth": ExportValueWithUnit,
  "maxTraceWidth": ExportValueWithUnit,
  "uniqueTraceWidths": 987,
  "minSpacing": ExportValueWithUnit,
  "copperArea": ExportValueWithUnit
}

ExportLineItemCosting

Fields
Field Name Description
scenarios - [ExportCostingScenario!]!
Example
{"scenarios": [ExportCostingScenario]}

ExportLineItemPricing

Fields
Field Name Description
quantity - Int!
unitPrice - Money
Example
{"quantity": 123, "unitPrice": Money}

ExportLineItemSpecs

Fields
Field Name Description
industrySector - String
ipcClassIII - Boolean
bareBoard - ExportBareBoard
assemblyOptions - ExportAssemblyOptions
projectBom - [ExportProjectBomItem!]
stackup - [ExportStackupLayer!]
layerFileMapping - [ExportLayerFileMapping!] Full gerber-file → PCB-layer mapping for every assigned layer file (copper, silk, mask, paste, drill, outline, mechanical).
padTraceData - ExportPadTraceData
drillData - ExportDrillData
fileNotes - [ExportFileNote!]
fileTables - [ExportFileTable!]
provenance - ExportProvenance
Example
{
  "industrySector": "abc123",
  "ipcClassIII": false,
  "bareBoard": ExportBareBoard,
  "assemblyOptions": ExportAssemblyOptions,
  "projectBom": [ExportProjectBomItem],
  "stackup": [ExportStackupLayer],
  "layerFileMapping": [ExportLayerFileMapping],
  "padTraceData": ExportPadTraceData,
  "drillData": ExportDrillData,
  "fileNotes": [ExportFileNote],
  "fileTables": [ExportFileTable],
  "provenance": ExportProvenance
}

ExportMeta

Fields
Field Name Description
schemaVersion - String!
generatedAt - DateTime!
supplierName - String
Example
{
  "schemaVersion": "xyz789",
  "generatedAt": "2007-12-03T10:15:30Z",
  "supplierName": "xyz789"
}

ExportPadTraceData

Fields
Field Name Description
layers - [ExportLayerPadTraceSummary!]!
totalPadCount - Int!
totalTraceCount - Int!
minSpacing - ExportValueWithUnit
totalCopperArea - ExportValueWithUnit
Example
{
  "layers": [ExportLayerPadTraceSummary],
  "totalPadCount": 987,
  "totalTraceCount": 123,
  "minSpacing": ExportValueWithUnit,
  "totalCopperArea": ExportValueWithUnit
}

ExportPanel

Fields
Field Name Description
panelWidth - ExportValueWithUnit
panelLength - ExportValueWithUnit
designFilesArePanel - Boolean
boardsPerAsmPanel - Int
Example
{
  "panelWidth": ExportValueWithUnit,
  "panelLength": ExportValueWithUnit,
  "designFilesArePanel": true,
  "boardsPerAsmPanel": 987
}

ExportPricingCalculation

Fields
Field Name Description
name - String!
floatValue - Float
booleanValue - Boolean
Example
{
  "name": "abc123",
  "floatValue": 123.45,
  "booleanValue": true
}

ExportPricingLineItem

Fields
Field Name Description
itemId - String
group - String!
name - String!
multiplier - String
cost - Money
markupPercent - Float
markupValue - Money
listPrice - Money
listMargin - Float
margin - Float
listGrossProfit - Money
grossProfit - Money
discountPercent - Float
discountValue - Money
isCustom - Boolean
details - String
qty - Float
moq - Float
attrition - Float
orderQuantity - Float!
unitPrice - Money Use unitSellPrice (same value, clearer name).
unitSellPrice - Money
total - Money Use totalSellPrice (same value, clearer name).
totalSellPrice - Money
customerSupplied - Boolean!
specs - ExportPricingLineItemSpecs
Example
{
  "itemId": "xyz789",
  "group": "abc123",
  "name": "abc123",
  "multiplier": "xyz789",
  "cost": Money,
  "markupPercent": 123.45,
  "markupValue": Money,
  "listPrice": Money,
  "listMargin": 123.45,
  "margin": 987.65,
  "listGrossProfit": Money,
  "grossProfit": Money,
  "discountPercent": 987.65,
  "discountValue": Money,
  "isCustom": false,
  "details": "abc123",
  "qty": 123.45,
  "moq": 123.45,
  "attrition": 123.45,
  "orderQuantity": 123.45,
  "unitPrice": Money,
  "unitSellPrice": Money,
  "total": Money,
  "totalSellPrice": Money,
  "customerSupplied": true,
  "specs": ExportPricingLineItemSpecs
}

ExportPricingLineItemSpecs

Fields
Field Name Description
partNumber - String
pricedPartNumber - String
partManufacturer - String
internalPartNumber - String
customerPartNumber - String
mfrIdentifier - String
customerIdentifier - String
mountType - String
description - String
notes - [String!]
potentialPackage - String
sourcingOption - String
substitutions - String
referenceDesignators - [ExportRefDesignator!]!
quantityPerBoard - Float!
lifeCycleStatus - String
lifeCycleStatusRaw - String
rohsStatus - String
rohsStatusRaw - String
reachStatus - String
reachStatusRaw - String
rohsCompliant - Boolean
reachCompliant - Boolean
countryOfOrigin - String
itemClass - String
leadCount - Float
lastPricingUpdate - DateTime
distributor - String Use vendor (same value, clearer name).
vendor - String
distributorSku - String Use vendorSku (same value, clearer name).
vendorSku - String
providerId - String
sourceUrl - String
clickUrl - String
leadTime - Float
stock - Float
minimumOrderQuantity - Float
tariffRate - Float
tariffRateView - Float
hsCode - String
tariffCost - Money
originalPrice - Money Use vendorUnitPrice (same value, clearer name).
vendorUnitPrice - Money
originalPriceWithoutTariffs - Money
factoredUnitCost - Money
factoredTotalCost - Money
unitPriceOverriddenBy - String
quantityForOrder - Float
quantityForOrderWithAttrition - Float
purchaseQuantity - Float
attritionQty - Float
attritionCost - Money
totalScrapQuantity - Float
totalScrapCost - Money
bomLandingFactor - Float
costFactorPercent - Float
customerSupplied - Boolean!
additionalDetails - [ExportBomAdditionalDetails!]
distributors - [String!]
distributorSkus - [String!]
orderMultiples - [Int!]
unitPrices - [Float!]
purchaseQuantities - [Float!]
allocatedQuantities - [Float!]
Example
{
  "partNumber": "xyz789",
  "pricedPartNumber": "xyz789",
  "partManufacturer": "abc123",
  "internalPartNumber": "xyz789",
  "customerPartNumber": "abc123",
  "mfrIdentifier": "xyz789",
  "customerIdentifier": "abc123",
  "mountType": "abc123",
  "description": "xyz789",
  "notes": ["xyz789"],
  "potentialPackage": "xyz789",
  "sourcingOption": "abc123",
  "substitutions": "xyz789",
  "referenceDesignators": [ExportRefDesignator],
  "quantityPerBoard": 987.65,
  "lifeCycleStatus": "xyz789",
  "lifeCycleStatusRaw": "abc123",
  "rohsStatus": "abc123",
  "rohsStatusRaw": "abc123",
  "reachStatus": "abc123",
  "reachStatusRaw": "abc123",
  "rohsCompliant": true,
  "reachCompliant": false,
  "countryOfOrigin": "abc123",
  "itemClass": "abc123",
  "leadCount": 123.45,
  "lastPricingUpdate": "2007-12-03T10:15:30Z",
  "distributor": "xyz789",
  "vendor": "abc123",
  "distributorSku": "abc123",
  "vendorSku": "abc123",
  "providerId": "abc123",
  "sourceUrl": "xyz789",
  "clickUrl": "xyz789",
  "leadTime": 987.65,
  "stock": 123.45,
  "minimumOrderQuantity": 987.65,
  "tariffRate": 987.65,
  "tariffRateView": 987.65,
  "hsCode": "xyz789",
  "tariffCost": Money,
  "originalPrice": Money,
  "vendorUnitPrice": Money,
  "originalPriceWithoutTariffs": Money,
  "factoredUnitCost": Money,
  "factoredTotalCost": Money,
  "unitPriceOverriddenBy": "abc123",
  "quantityForOrder": 123.45,
  "quantityForOrderWithAttrition": 123.45,
  "purchaseQuantity": 987.65,
  "attritionQty": 123.45,
  "attritionCost": Money,
  "totalScrapQuantity": 123.45,
  "totalScrapCost": Money,
  "bomLandingFactor": 123.45,
  "costFactorPercent": 987.65,
  "customerSupplied": true,
  "additionalDetails": [ExportBomAdditionalDetails],
  "distributors": ["abc123"],
  "distributorSkus": ["abc123"],
  "orderMultiples": [123],
  "unitPrices": [123.45],
  "purchaseQuantities": [987.65],
  "allocatedQuantities": [987.65]
}

ExportProduct

Fields
Field Name Description
meta - ExportMeta!
kind - String!
productId - String!
partNumber - String
specs - ExportLineItemSpecs
costing - ExportLineItemCosting
Example
{
  "meta": ExportMeta,
  "kind": "xyz789",
  "productId": "abc123",
  "partNumber": "xyz789",
  "specs": ExportLineItemSpecs,
  "costing": ExportLineItemCosting
}

ExportProductJobResponse

Fields
Field Name Description
jobId - String!
status - String!
data - ExportProduct
warnings - [ApiWarning!] Non-fatal warnings about the exported data
errors - [ErrorListExportProductJob!]!
Example
{
  "jobId": "xyz789",
  "status": "xyz789",
  "data": ExportProduct,
  "warnings": [ApiWarning],
  "errors": [ErrorExportProductNotFound]
}

ExportProjectBomItem

Fields
Field Name Description
id - String
partNumber - String
pricedPartNumber - String
partManufacturer - String
internalPartNumber - String
customerPartNumber - String
mfrIdentifier - String
customerIdentifier - String
mountType - String
description - String
notes - [String!]!
potentialPackage - String
sourcingOption - String
substitutions - String
referenceDesignators - [ExportRefDesignator!]!
quantityPerBoard - Float!
customerSupplied - Boolean!
lifeCycleStatus - String
lifeCycleStatusRaw - String
rohsStatus - String
rohsStatusRaw - String
reachStatus - String
reachStatusRaw - String
rohsCompliant - Boolean
reachCompliant - Boolean
countryOfOrigin - String
minimumOrderQuantity - Float
itemClass - String
leadCount - Float
lastPricingUpdate - DateTime
Example
{
  "id": "xyz789",
  "partNumber": "abc123",
  "pricedPartNumber": "xyz789",
  "partManufacturer": "xyz789",
  "internalPartNumber": "xyz789",
  "customerPartNumber": "xyz789",
  "mfrIdentifier": "xyz789",
  "customerIdentifier": "xyz789",
  "mountType": "abc123",
  "description": "xyz789",
  "notes": ["xyz789"],
  "potentialPackage": "xyz789",
  "sourcingOption": "xyz789",
  "substitutions": "xyz789",
  "referenceDesignators": [ExportRefDesignator],
  "quantityPerBoard": 987.65,
  "customerSupplied": true,
  "lifeCycleStatus": "xyz789",
  "lifeCycleStatusRaw": "xyz789",
  "rohsStatus": "xyz789",
  "rohsStatusRaw": "xyz789",
  "reachStatus": "xyz789",
  "reachStatusRaw": "xyz789",
  "rohsCompliant": false,
  "reachCompliant": true,
  "countryOfOrigin": "abc123",
  "minimumOrderQuantity": 987.65,
  "itemClass": "abc123",
  "leadCount": 123.45,
  "lastPricingUpdate": "2007-12-03T10:15:30Z"
}

ExportProjectCalculation

Fields
Field Name Description
name - String!
value - StringOrNumberOrBoolean!
Example
{
  "name": "xyz789",
  "value": StringOrNumberOrBoolean
}

ExportProjectValidationDetails

Fields
Field Name Description
bareBoardValidationSummary - ExportValidationSummary
assemblyValidationSummary - ExportValidationSummary
bomValidationSummary - ExportBomValidationSummary
bareBoardValidationIssues - [ExportBareBoardValidationIssue!]
assemblyWithSubstitutions - [ExportAssemblySubstitution!]
assemblyPlacementIssues - [ExportAssemblyPlacementIssue!]
Example
{
  "bareBoardValidationSummary": ExportValidationSummary,
  "assemblyValidationSummary": ExportValidationSummary,
  "bomValidationSummary": ExportBomValidationSummary,
  "bareBoardValidationIssues": [
    ExportBareBoardValidationIssue
  ],
  "assemblyWithSubstitutions": [
    ExportAssemblySubstitution
  ],
  "assemblyPlacementIssues": [
    ExportAssemblyPlacementIssue
  ]
}

ExportProvenance

Fields
Field Name Description
areas - [ExportProvenanceArea!]!
totalDecisions - Int!
Example
{"areas": [ExportProvenanceArea], "totalDecisions": 987}

ExportProvenanceArea

Fields
Field Name Description
area - String!
entries - [ExportProvenanceEntry!]!
Example
{
  "area": "abc123",
  "entries": [ExportProvenanceEntry]
}

ExportProvenanceEntry

Fields
Field Name Description
source - String!
message - String!
sourceFile - String
Example
{
  "source": "abc123",
  "message": "xyz789",
  "sourceFile": "abc123"
}

ExportQuote

Fields
Field Name Description
meta - ExportMeta!
kind - String!
currency - String!
quote - ExportQuoteHeader!
Example
{
  "meta": ExportMeta,
  "kind": "abc123",
  "currency": "abc123",
  "quote": ExportQuoteHeader
}

ExportQuoteHeader

Fields
Field Name Description
quoteNumber - String!
quoteDate - DateTime
expiryDate - DateTime
customerCompanyName - String
mainPOCName - String!
mainPOCPhone - String
mainPOCEmail - String
notesAndTerms - String!
shipTo - ExportAddress
billTo - ExportAddress
subtotal - Money
total - Money
shipping - Money
tax - Money
lineItems - [ExportQuoteLineItem!]!
Example
{
  "quoteNumber": "xyz789",
  "quoteDate": "2007-12-03T10:15:30Z",
  "expiryDate": "2007-12-03T10:15:30Z",
  "customerCompanyName": "xyz789",
  "mainPOCName": "xyz789",
  "mainPOCPhone": "abc123",
  "mainPOCEmail": "xyz789",
  "notesAndTerms": "xyz789",
  "shipTo": ExportAddress,
  "billTo": ExportAddress,
  "subtotal": Money,
  "total": Money,
  "shipping": Money,
  "tax": Money,
  "lineItems": [ExportQuoteLineItem]
}

ExportQuoteJobResponse

Fields
Field Name Description
jobId - String!
status - String!
data - ExportQuote
errors - [ErrorListExportQuoteJob!]!
Example
{
  "jobId": "xyz789",
  "status": "abc123",
  "data": ExportQuote,
  "errors": [ErrorExportQuoteNotFound]
}

ExportQuoteLineItem

Fields
Field Name Description
kind - String!
lineItemId - Int!
lineNumber - Int!
sku - String
productId - String!
partNumber - String
comments - String
pricing - ExportLineItemPricing!
specs - ExportLineItemSpecs
costing - ExportLineItemCosting
Example
{
  "kind": "abc123",
  "lineItemId": 987,
  "lineNumber": 987,
  "sku": "xyz789",
  "productId": "abc123",
  "partNumber": "xyz789",
  "comments": "xyz789",
  "pricing": ExportLineItemPricing,
  "specs": ExportLineItemSpecs,
  "costing": ExportLineItemCosting
}

ExportQuoteLineItemJobResponse

Fields
Field Name Description
jobId - String!
status - String!
data - ExportQuote
errors - [ErrorListExportQuoteLineItemJob!]!
Example
{
  "jobId": "xyz789",
  "status": "abc123",
  "data": ExportQuote,
  "errors": [ErrorExportQuoteNotFound]
}

ExportRefDesignator

Fields
Field Name Description
designator - String!
dnp - Boolean!
Example
{"designator": "abc123", "dnp": true}

ExportStackupLayer

Fields
Field Name Description
type - String!
fileType - String!
typeIndex - Int!
circuitBoardLayerNumber - Int
copperThickness - ExportValueWithUnit
dielectricType - String
dielectricThickness - ExportValueWithUnit
plated - Boolean
drillSpanStart - Int
drillSpanEnd - Int
fileName - String Assigned gerber file name for this stackup layer; null when no file is assigned.
Example
{
  "type": "abc123",
  "fileType": "abc123",
  "typeIndex": 987,
  "circuitBoardLayerNumber": 987,
  "copperThickness": ExportValueWithUnit,
  "dielectricType": "xyz789",
  "dielectricThickness": ExportValueWithUnit,
  "plated": true,
  "drillSpanStart": 123,
  "drillSpanEnd": 987,
  "fileName": "abc123"
}

ExportTextWithUnit

Fields
Field Name Description
value - String
unit - String
Example
{
  "value": "xyz789",
  "unit": "abc123"
}

ExportValidationSummary

Fields
Field Name Description
reasonsCannotDoJob - String
requiresManualPricingReview - String
Example
{
  "reasonsCannotDoJob": "abc123",
  "requiresManualPricingReview": "xyz789"
}

ExportValueWithUnit

Fields
Field Name Description
value - Float
unit - String
Example
{"value": 987.65, "unit": "xyz789"}

FileToUploadWithURL

Fields
Input Field Description
path - String!

Please specify the path in which the file is located relative to the project root folder, including the file name.

Example 1: If you have a gerber file named LFG-F.Cu.gbr inside the folder My Project, its relative file path would be ./LFG-F.Cu.gbr.

Example 2: If you have a gerber file named ABC-B.Cu.gbr inside the folder My Project/Gerbers, its relative file path would be ./Gerbers/ABC-B.Cu.gbr.

type - String

The type of the file. If passed in, you can use one of the following values:

  • Bill Of Material: Use it to specify a BOM. Our system will automatically parse it during the analyzeProject function and attempt retrieve sourcing information so you can get a more accurate pricing.
  • Pick And Place/Centroid: Use it to specify a Pick and Place file.
  • Other Attachment: Use it if you don't know the type of the file.
  • Gerber/Drill File: Use it to define a gerber file.
  • ODB++: Use it to define an ODB++ tarball file.

This field is nullable, so you can choose to omit it from your request.

url - String! The url of the file to upload. Please make sure it is accessible through https.
Example
{
  "path": "xyz789",
  "type": "xyz789",
  "url": "abc123"
}

Float

Description

The Float scalar type represents signed double-precision fractional values as specified by IEEE 754.

Example
987.65

GetManufacturersResponse

Fields
Field Name Description
mfrId - Int!
manufacturer - Manufacturer
errors - [ErrorListGetManufacturers!]!
Example
{
  "mfrId": 987,
  "manufacturer": Manufacturer,
  "errors": [ErrorMfrNotFound]
}

GetRFQResponse

Fields
Field Name Description
rfq - RFQStatus
errors - [ErrorListGetRFQ!]!
Example
{
  "rfq": RFQStatus,
  "errors": [ErrorRFQNotFound]
}

IError

IErrorStatusCode

Fields
Field Name Description
code - String!
message - String
statusCode - Int!
Possible Types
IErrorStatusCode Types

ErrorLimitExceeded

Example
{
  "code": "abc123",
  "message": "abc123",
  "statusCode": 987
}

Int

Description

The Int scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.

Example
987

LayerFileMapResponse

Fields
Field Name Description
layers - [ExportLayerFileMapping!]! One entry per assigned layer file — layer role, layer number where applicable, and the assigned gerber file name (null when unassigned) — covering copper, silk, mask, paste, drill, outline, and mechanical.
Example
{"layers": [ExportLayerFileMapping]}

LayerMeshAsset

Description

One rendered board layer's mesh, for a completed layerMesh asset-export job.

Fields
Field Name Description
fileType - String! The board layer this mesh represents (e.g. "topCopper", "bottomMask", "topSilk"), or the synthesized board-core "dielectric" layer.
fileId - String The source gerber file id this mesh was generated from. For the "dielectric" layer this is the outline file's id, reused — there is no separate dielectric file.
format - String! Mesh format for this entry. Only "gltf" (binary glTF / .glb) ships today. Additional formats (e.g. "pcb3") will appear as additional entries sharing the same fileType, not new fields — this shape does not need to change to add them.
url - String! Presigned S3 GET URL for the mesh (a binary glTF ".glb" file). Valid for ~1 hour; re-poll retrieveAsset to mint a fresh URL.
contentType - String! MIME type of the referenced asset — "model/gltf-binary" for the "gltf" format.
units - MeshUnit! Linear unit of this mesh's coordinates. Always MICRONS today; hardcoded rather than omitted so consumers convert deliberately instead of guessing.
Example
{
  "fileType": "abc123",
  "fileId": "xyz789",
  "format": "abc123",
  "url": "xyz789",
  "contentType": "abc123",
  "units": "MICRONS"
}

ListProjectsResponse

Fields
Field Name Description
projects - [ProjectListItem!]! Page of projects sorted by the requested sortBy (default creationDate) desc, then _id desc tiebreaker.
nextCursor - String Opaque cursor to pass as after on the next call. Null when the page is the last one.
errors - [ErrorListGetProject!]!
Example
{
  "projects": [ProjectListItem],
  "nextCursor": "xyz789",
  "errors": [ErrorAccessDenied]
}

Manufacturer

Fields
Field Name Description
_id - Int!
displayName - String!
type - ManufacturerType
products - [MfrProductTypes!]!
pcbSaleCenterUrl - String!
pcbQuickUrl - String!
preferredCurrency - String
logoUrl - String
website - String
Example
{
  "_id": 987,
  "displayName": "xyz789",
  "type": "EMS",
  "products": ["pcbSalesCenter"],
  "pcbSaleCenterUrl": "xyz789",
  "pcbQuickUrl": "abc123",
  "preferredCurrency": "abc123",
  "logoUrl": "abc123",
  "website": "abc123"
}

ManufacturerType

Values
Enum Value Description

EMS

PCB

BOTH

Example
"EMS"

MeshUnit

Description

Linear unit of mesh coordinates. Declared per entry so consumers scale explicitly (glTF tooling otherwise assumes meters) and so future units can be added without a breaking change.

Values
Enum Value Description

MICRONS

Example
"MICRONS"

MfrProductTypes

Values
Enum Value Description

pcbSalesCenter

internalQuotingSimplified

pcbQuickPrice

quoteExportsAndTemplates

Example
"pcbSalesCenter"

Money

Fields
Field Name Description
value - Float!
formatted - String!
currency - String!
Example
{
  "value": 987.65,
  "formatted": "abc123",
  "currency": "abc123"
}

OpenProjectResponse

Fields
Field Name Description
token - String
errors - [ErrorListGetProject!]!
Example
{
  "token": "abc123",
  "errors": [ErrorAccessDenied]
}

Price

Fields
Field Name Description
unitPrice - Float!
subtotal - Float!
quantity - Int!
currency - String
projectType - String
Example
{
  "unitPrice": 987.65,
  "subtotal": 987.65,
  "quantity": 123,
  "currency": "abc123",
  "projectType": "xyz789"
}

PriceResponse

Fields
Field Name Description
mfrId - Int!
mfrDisplayName - String
price - Price
errors - [ErrorListGetProjectPrices!]!
Example
{
  "mfrId": 123,
  "mfrDisplayName": "xyz789",
  "price": Price,
  "errors": [ErrorProjectNotFound]
}

ProfitProjection

Fields
Field Name Description
type - String!
mfrCost - Money!
markup - Float!
listMargin - Float!
margin - Float!
listGrossProfit - Money!
grossProfit - Money!
listPrice - Money!
discountPercentage - Float!
discountValue - Money!
price - Money!
overheadFactoredCost - Money!
landingValue - Money!
overheadFactor - Float
Example
{
  "type": "abc123",
  "mfrCost": Money,
  "markup": 987.65,
  "listMargin": 987.65,
  "margin": 123.45,
  "listGrossProfit": Money,
  "grossProfit": Money,
  "listPrice": Money,
  "discountPercentage": 987.65,
  "discountValue": Money,
  "price": Money,
  "overheadFactoredCost": Money,
  "landingValue": Money,
  "overheadFactor": 123.45
}

Project

Fields
Field Name Description
_id - String!
creationSource - String!
apiConsumerId - String
externalAccountId - String
companyName - String
name - String
designerEmail - String
creationDate - DateTime!
lastModifiedDate - DateTime!
boardFileType - String!

Tells the type of design files that were used to create the project. We do not recommend opening the Price Display when fileType is 'Unknown'.

Posible values are 'Unknown' or 'Gerber' or 'ODB++';

editorLink - String
technicalDetails - TechnicalDetailsCD1 Technical specifications extracted from the project board design.
getPrices - [PriceResponse!]!

Allows to query manufacturer prices for the project. Quantity and Manufacturer ids are optional.

Examples:

  • Using default quantity and no manufacturer ids:
getPrices {
    price {
        mfrId
        unitPrice
        subtotal
    }
    errors: {
        ...on IError {
            code
            mesage
        }
    }
}
  • With quantity and no manufacturer ids (uses all available):
getPrices(quantity: 200) {
    price {
        mfrId
        unitPrice
        subtotal
    }
    errors: {
        ...on IError {
            code
            mesage
        }
    }
}
  • Using quantity and manufacturer ids
getPrices(quantity: 200, manufacturerIds: [123,124,125]) {
    price {
        mfrId
        unitPrice
        subtotal
    }
    errors: {
        ...on IError {
            code
            mesage
        }
    }
}
Arguments
manufacturerIds - [Int!]
quantity - Int
Example
{
  "_id": "xyz789",
  "creationSource": "xyz789",
  "apiConsumerId": "abc123",
  "externalAccountId": "xyz789",
  "companyName": "xyz789",
  "name": "xyz789",
  "designerEmail": "abc123",
  "creationDate": "2007-12-03T10:15:30Z",
  "lastModifiedDate": "2007-12-03T10:15:30Z",
  "boardFileType": "xyz789",
  "editorLink": "xyz789",
  "technicalDetails": TechnicalDetailsCD1,
  "getPrices": [PriceResponse]
}

ProjectAnalysisCancelResponse

Fields
Field Name Description
success - Boolean!
errors - [ErrorListUpdateProject!]!
Example
{"success": false, "errors": [ErrorProjectNotUpdated]}

ProjectAnalysisResponse

Fields
Field Name Description
analysis - ProjectFilesAnalysis
warnings - [ApiWarning!] Non-fatal warnings about the analysis result
errors - [ErrorListAnalyzeProject!]!
Example
{
  "analysis": ProjectFilesAnalysis,
  "warnings": [ApiWarning],
  "errors": [ErrorAccessDenied]
}

ProjectCreationResponse

Fields
Field Name Description
project - ProjectUpsert
errors - [ErrorListCreateProject!]!
Example
{
  "project": ProjectUpsert,
  "errors": [ErrorProjectNotCreated]
}

ProjectDeletionResponse

Fields
Field Name Description
success - Boolean!
errors - [ErrorListDeleteProject!]!
Example
{"success": true, "errors": [ErrorProjectNotFound]}

ProjectFile

Fields
Input Field Description
path - String!

Please specify the path in which the file is located relative to the project root folder, including the file name.

Example 1: If you have a gerber file named LFG-F.Cu.gbr inside the folder My Project, its relative file path would be ./LFG-F.Cu.gbr.

Example 2: If you have a gerber file named ABC-B.Cu.gbr inside the folder My Project/Gerbers, its relative file path would be ./Gerbers/ABC-B.Cu.gbr.

type - String

The type of the file. If passed in, you can use one of the following values:

  • Bill Of Material: Use it to specify a BOM. Our system will automatically parse it during the analyzeProject function and attempt retrieve sourcing information so you can get a more accurate pricing.
  • Pick And Place/Centroid: Use it to specify a Pick and Place file.
  • Other Attachment: Use it if you don't know the type of the file.
  • Gerber/Drill File: Use it to define a gerber file.
  • ODB++: Use it to define an ODB++ tarball file.

This field is nullable, so you can choose to omit it from your request.

Example
{
  "path": "abc123",
  "type": "abc123"
}

ProjectFilesAnalysis

Fields
Field Name Description
complete - Boolean!
Example
{"complete": false}

ProjectListItem

Fields
Field Name Description
projectId - String! The project id you would pass to getProject.
name - String! Display name. partNumber, falling back to the legacy name field, then the id.
Example
{
  "projectId": "xyz789",
  "name": "xyz789"
}

ProjectResponse

Fields
Field Name Description
project - Project
errors - [ErrorListGetProject!]!
Example
{
  "project": Project,
  "errors": [ErrorAccessDenied]
}

ProjectRestoreResponse

Fields
Field Name Description
success - Boolean!
errors - [ErrorListRestoreProject!]!
Example
{"success": false, "errors": [ErrorProjectNotFound]}

ProjectSuggestionChangeInput

Fields
Input Field Description
property - String! The property name to suggest a change for. Use the field names from TechnicalDetailsCD1: materialType, numberOfLayers, solderMask, finishSurface, baseCuThicknessMM, singlePCBWidthMM, singlePCBLengthMM, panelWidthMM, panelLengthMM, pcbPerPanel, IPCClass
value - String! The value to suggest for the property. Can be String, Int, or Float depending on the property type. Send numbers as strings (e.g., "2" for numberOfLayers). The API will validate and convert to the correct type.
otherText - String Required when value is 'Other'. Write-in text (2–50 characters).
confidence - Int Confidence level for this suggestion (1-100). Defaults to 100 if not provided
Example
{
  "property": "xyz789",
  "value": "xyz789",
  "otherText": "abc123",
  "confidence": 123
}

ProjectSuggestionsResponse

Fields
Field Name Description
success - Boolean
message - String
errors - [ErrorListProjectSuggestions!]!
Example
{
  "success": false,
  "message": "abc123",
  "errors": [ErrorProjectNotFound]
}

ProjectUpdateResponse

Fields
Field Name Description
project - ProjectUpsert
errors - [ErrorListUpdateProject!]!
Example
{
  "project": ProjectUpsert,
  "errors": [ErrorProjectNotUpdated]
}

ProjectUpsert

Fields
Field Name Description
_id - String!
Example
{"_id": "abc123"}

RFQAddressInput

Fields
Input Field Description
address1 - String!
address2 - String
city - String!
province - String!
country - String!
postalCode - String!
Example
{
  "address1": "xyz789",
  "address2": "abc123",
  "city": "xyz789",
  "province": "xyz789",
  "country": "xyz789",
  "postalCode": "xyz789"
}

RFQStatus

Fields
Field Name Description
complete - Boolean! True when the ERP has assigned a quote number.
quoteNumber - String The ERP-assigned quote number.
quoteLink - String Direct link to view this quote in the platform.
Example
{
  "complete": true,
  "quoteNumber": "abc123",
  "quoteLink": "xyz789"
}

SchemaVersionSettings

Fields
Field Name Description
override - String
resolved - String!
Example
{
  "override": "xyz789",
  "resolved": "abc123"
}

String

Description

The String scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.

Example
"xyz789"

StringOrNumberOrBoolean

Description

A String, Float or Boolean union type

Example
StringOrNumberOrBoolean

SubmitRFQInput

Fields
Input Field Description
projectId - String! The project ID to create an RFQ for.
countryOfOrigin - String! Country of origin label (e.g. "China", "United States").
leadTime - String! Lead time option: "Standard", "Rush", or "Backordered".
shippingAddress - RFQAddressInput Shipping address for this quote. If omitted, the most recently used address for the designer account is used.
quantity - Int Quantity to quote. Defaults to 10.
shippingContactName - String Contact name for the shipping address.
Example
{
  "projectId": "abc123",
  "countryOfOrigin": "abc123",
  "leadTime": "xyz789",
  "shippingAddress": RFQAddressInput,
  "quantity": 123,
  "shippingContactName": "abc123"
}

SubmitRFQResponse

Fields
Field Name Description
result - SubmitRFQResult
errors - [ErrorListSubmitRFQ!]!
Example
{
  "result": SubmitRFQResult,
  "errors": [ErrorRFQNotCreated]
}

SubmitRFQResult

Fields
Field Name Description
quoteId - Int! Internal quote ID. Use this with getRFQ to poll for the quote number.
Example
{"quoteId": 123}

TechnicalDetailsCD1

Fields
Field Name Description
version - String! The version of the field mapping used
materialType - String PCB material type. Common values: FR-4 Fiberglass, PTFE (Teflon), Aluminum-Core IMS, Polyimide (PI / Kapton). See MaterialTypeOptions for the full list including Rogers, ceramic, and other specialty laminates.
materialTypeOtherText - String Write-in text when materialType is 'Other' (2–50 characters)
numberOfLayers - Int Number of copper layers in the PCB
solderMask - String Solder mask color. Possible values: Green, Green Matte, Green Semi-Matte, Green Glossy, Blue, Black, Yellow, Red, Purple, White, LED White, Clear, None, Other
solderMaskOtherText - String Write-in text when solderMask is 'Other' (2–50 characters)
finishSurface - String Surface finish type. Possible values: HASL Lead Free, HASL Leaded, Gold (ENIG), Immersion Tin, Immersion Silver, OSP Surface, ENEPIG, Other
finishSurfaceOtherText - String Write-in text when finishSurface is 'Other' (2–50 characters)
baseCuThicknessMM - Float Base copper thickness in millimeters
singlePCBWidthMM - Float Single PCB width in millimeters
singlePCBLengthMM - Float Single PCB length in millimeters
panelWidthMM - Float Panel width in millimeters (if panelized)
panelLengthMM - Float Panel length in millimeters (if panelized)
pcbPerPanel - Int Number of PCBs per assembly panel (if panelized)
IPCClass - Int IPC class (2 for Class II, 3 for Class III)
industrySector - String Industry sector. Possible values: Unknown, Automotive, Automotive Safety, Aerospace, Aviation, Defense, Medical, Industrial, Consumer Electronics, Information Technology, White Goods, Other
viaPlug - String Via plugging type. Possible values: None, Type I Tent, Type II Tent & Cover, Type III Plug, Type IV Plug & Cover, Type V Fill Epoxy, Type VI Fill & Cover Epoxy, Type VII Fill & Cap Epoxy, Type VII Fill & Cap Copper, Solder Mask Plug & Cover
ctiValue - String Laminate CTI (Comparative Tracking Index) value. Possible values: PLC 0 (CTI >= 600V), PLC 1 (CTI >= 400V), PLC 2 (CTI >= 250V), PLC 3 (CTI >= 175V)
materialTg - String Material glass transition temperature (Tg). Possible values: 110°C, 130°C, 140°C, 150°C, 170°C, 180°C, 210°C, 250°C, 280°C+
peelableSolderMask - Boolean Whether peelable solder mask is required
controlledImpedance - Boolean Whether controlled impedance is required. Enabling it adds a pricing surcharge and can extend lead time
Example
{
  "version": "xyz789",
  "materialType": "xyz789",
  "materialTypeOtherText": "xyz789",
  "numberOfLayers": 987,
  "solderMask": "abc123",
  "solderMaskOtherText": "abc123",
  "finishSurface": "abc123",
  "finishSurfaceOtherText": "xyz789",
  "baseCuThicknessMM": 123.45,
  "singlePCBWidthMM": 987.65,
  "singlePCBLengthMM": 123.45,
  "panelWidthMM": 987.65,
  "panelLengthMM": 987.65,
  "pcbPerPanel": 987,
  "IPCClass": 987,
  "industrySector": "xyz789",
  "viaPlug": "xyz789",
  "ctiValue": "xyz789",
  "materialTg": "abc123",
  "peelableSolderMask": false,
  "controlledImpedance": false
}

TokenUsageBreakdownType

Fields
Field Name Description
projects - Int!
copperLayers - Int!
bomParsing - Int!
projectPricing - Int!
bomPricing - Int!
designNotesAnalyzed - Int!
dfm - Int!
Example
{
  "projects": 123,
  "copperLayers": 123,
  "bomParsing": 123,
  "projectPricing": 987,
  "bomPricing": 123,
  "designNotesAnalyzed": 123,
  "dfm": 987
}

TokenUsageData

Fields
Field Name Description
totalTokens - Int!
monthlyTokensIncluded - Int
billingPeriodStart - DateTime!
billingPeriodEnd - DateTime!
breakdown - TokenUsageBreakdownType!
tokenUsageHistory - [TokenUsageEntryType!]!
Example
{
  "totalTokens": 987,
  "monthlyTokensIncluded": 987,
  "billingPeriodStart": "2007-12-03T10:15:30Z",
  "billingPeriodEnd": "2007-12-03T10:15:30Z",
  "breakdown": TokenUsageBreakdownType,
  "tokenUsageHistory": [TokenUsageEntryType]
}

TokenUsageEntryType

Fields
Field Name Description
productId - String!
action - String!
tokens - Int!
date - DateTime!
Example
{
  "productId": "xyz789",
  "action": "xyz789",
  "tokens": 987,
  "date": "2007-12-03T10:15:30Z"
}

TokenUsageResponse

Fields
Field Name Description
data - TokenUsageData
errors - [ErrorListGetTokenUsage!]!
Example
{
  "data": TokenUsageData,
  "errors": [ErrorInvalidBillingPeriod]
}

UploadFilesWithURLsResponse

Fields
Field Name Description
ok - Boolean!
errors - [ErrorListUploadFilesWithURLs!]!
Example
{"ok": false, "errors": [ErrorNoFiles]}

WritePolicies

Fields
Field Name Description
requestId - String!
policies - [WritePolicyResponse!]!
Example
{
  "requestId": "xyz789",
  "policies": [WritePolicyResponse]
}

WritePoliciesResponse

Fields
Field Name Description
writePolicies - WritePolicies
errors - [ErrorListGetFileUploadPolicies!]!
Example
{
  "writePolicies": WritePolicies,
  "errors": [ErrorNoFiles]
}

WritePolicy

Fields
Field Name Description
method - WritePolicyMethod! The HTTP method to upload with: POST for an S3-style form upload, or PUT for a single presigned-URL upload (e.g. Azure Blob). Branch on this to decide whether to send fields as a form (POST) or headers on a raw-body PUT.
url - String!
fields - [String!]! POST uploads only. An array of [key, value] pairs. Each inner array is a single form field — element 0 is the key and element 1 is the value — to append to the S3 multipart upload form before uploading the file to the url. Send them exactly as provided; do not treat this as a flat list of strings. Empty for a PUT upload (use headers instead).
headers - [String!] PUT uploads only. An array of [key, value] request-header pairs to send on the raw-body PUT to url. Null/absent for a POST upload.
Example
{
  "method": "POST",
  "url": "abc123",
  "fields": ["xyz789"],
  "headers": ["abc123"]
}

WritePolicyMethod

Description

How a file is uploaded to the object store: an S3-style multipart form POST, or a raw-body PUT to a presigned URL (e.g. Azure Blob).

Values
Enum Value Description

POST

PUT

Example
"POST"

WritePolicyResponse

Fields
Field Name Description
fileName - String!
filePath - String!
policy - WritePolicy!
Example
{
  "fileName": "xyz789",
  "filePath": "abc123",
  "policy": WritePolicy
}