Skip to content

Smartsheet#

Smartsheet is registered for CSV import and API-token sync. Both paths expect a TeamBoost task-template-shaped Smartsheet grid: rows become reviewable import session entries, then each row is projected into the internal integrations task-create draft for operator review.

Capability Method Status
CSV_IMPORT Upload a Smartsheet grid CSV export Built
SYNC Pull rows from one configured Smartsheet sheet Built
USER_IMPORT Contact/user candidates imported during sync Built as part of API sync
WEBHOOK Smartsheet webhook callback handling Not built

The endpoints below live under /api/v1/providers/smartsheet/.... They are generic - the same routes serve any registered provider by substituting the {provider} path segment. All routes require an organization-scoped user token (see Authentication).

Importing From CSV#

POST /api/v1/providers/smartsheet/imports/csv?organization_id=<id>
curl -X POST "https://<host>/api/v1/providers/smartsheet/imports/csv?organization_id=590789" \
  -H "Authorization: Bearer <user-token>" \
  -F "file=@smartsheet-task-export.csv"

The first Smartsheet CSV capability supports a TeamBoost task-template-shaped grid export, not arbitrary Smartsheet column mapping. The CSV must include a title column.

Required field Accepted column names
Title Title, Task, Task Name, Name, Summary

Optional fields the parser understands include Row ID, Task ID, Type, Status, Priority, Description, Notes, Assignee, Assignee Email, Assignee ID, Creator, Creator Email, Creator ID, Due Date, Labels, Project, Task Group, Created Time, Last Modified Time, Attachments, and Attachment Summary. Any exported column is preserved in the lossless source record; unknown non-empty columns are also surfaced in descriptionJson as unmappedColumns.

Rows without a stable row id use an import-local identifier like smartsheet-row-1 and carry a non-blocking mapping note. Malformed rows are returned in rowErrors rather than failing the whole import. A file that does not carry a title column fails with invalid_csv_format.

API Sync#

PUT /api/v1/providers/smartsheet/credentials?organization_id=<id>
POST /api/v1/providers/smartsheet/credentials/verify?organization_id=<id>
POST /api/v1/providers/smartsheet/imports/sync?organization_id=<id>

The stored secret is encrypted at rest and must be a JSON object:

{
  "token": "smartsheet-access-token",
  "sheet_id": "4567890123456788",
  "base_url": "https://api.smartsheet.com/2.0"
}

base_url must be one of the supported Smartsheet API region hosts ending in /2.0: https://api.smartsheet.com/2.0, https://api.smartsheet.eu/2.0, or https://api.smartsheet.au/2.0. Tokens are sent as Authorization: Bearer <token>. Verification makes a cheap read-only sheet probe; rejected tokens, missing permissions, or an inaccessible sheet return invalid_api_key.

curl -X PUT "https://<host>/api/v1/providers/smartsheet/credentials?organization_id=590789" \
  -H "Authorization: Bearer <user-token>" \
  -H "Content-Type: application/json" \
  -d '{"secret":"{\"token\":\"smartsheet-access-token\",\"sheet_id\":\"4567890123456788\",\"base_url\":\"https://api.smartsheet.com/2.0\"}"}'

curl -X POST "https://<host>/api/v1/providers/smartsheet/imports/sync?organization_id=590789" \
  -H "Authorization: Bearer <user-token>"

API sync fetches the configured sheet with object values and row permalinks. The same column aliases as CSV import are used. Contact cells are converted into imported users for the proposed TeamBoost mapping; this is why Smartsheet declares USER_IMPORT, but there is no standalone user-directory endpoint.

The Import Session#

{
  "status": "success",
  "message": "CSV parsed; review the proposed user mapping.",
  "data": {
    "provider": "smartsheet",
    "capability": "CSV_IMPORT",
    "status": "PROJECTION_ERRORS",
    "summary": {
      "taskCount": 2,
      "userCount": 4,
      "errorCount": 0,
      "projectionErrorCount": 1,
      "mappingNoteCount": 2
    },
    "taskEntries": [
      {
        "index": 0,
        "projected": {
          "title": "Draft launch checklist",
          "type": "OTHER",
          "status": "IN_PROGRESS",
          "priority": "HIGH",
          "projectTitle": "Platform",
          "taskGroupTitle": "Launch",
          "source": "smartsheet",
          "scheduleStage": "PENDING"
        },
        "projectionErrors": [
          "Assignee 'aziz@example.com' is not mapped to a TeamBoost member; resolve the user mapping before confirming."
        ],
        "mappingNotes": [
          "Smartsheet attachment columns are preserved in description_json but are not uploaded into TeamBoost by CSV import."
        ]
      }
    ]
  }
}

Projection Field Coverage#

Smartsheet source TeamBoost draft field Notes
Title / aliases title Error if shorter than 2 characters
Type / Task Type type Common task types map directly; unknowns default to OTHER with a mapping note
Description / Notes description
Status status Common to-do names map to NOT_STARTED; in-progress names map to IN_PROGRESS; Blocked maps to BLOCKED; done names map to COMPLETED; canceled names map to CANCELED; unknown names are left unset
Priority priority urgent/critical/high/medium/low map to TeamBoost priority values; missing priority becomes UNKNOWN
Creator id/e-mail, when present creatorId Resolved through the user mapping. If the creator is unmapped, creatorId is left unset with a mapping note
First assignee id/e-mail ownerId Present-but-unmapped assignee is a blocking projectionError; additional assignees are preserved with a mapping note
Labels / Tags labels Pass-through; TeamBoost creates/maps labels server-side
Project projectTitle
Task Group taskGroupTitle
Due Date plannedEndDate Invalid due-date values are left unset with a mapping note
Row id, attachments, raw-only columns descriptionJson Context only; imports do not upload Smartsheet attachments

Not Built Yet#

  • Arbitrary Smartsheet column mapping.
  • Standalone Smartsheet user-directory import.
  • OAuth app install flow.
  • Webhook registration, callback challenge handling, and callback authenticity verification.