For the complete documentation index, see llms.txt. This page is also available as Markdown.

Classic Vocabulary (aliases)

The same operations in the original survey_series / survey / question naming. Fully supported and not deprecated — but new integrations should prefer the feedback-group routes above, which match the product's own vocabulary. A survey_series is a feedback group; a survey is a source; a question is a field.

Push content rows to a question

post

Append free-text or typed content to one question on a survey via the customer's Input API key. Idempotent when an Idempotency-Key header is provided — duplicate keys with the same payload replay the original response within a 24h window.

Requires permission: push or create or all.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Header parameters
Idempotency-Keystring · max: 255Optional

Opaque client-supplied key for safe retries (24h window).

Body
survey_series_idstringRequired

Target survey series id

survey_idstringRequired

Target survey id within the series

source_referencestring · max: 255 · nullableOptional

Free-form identifier the customer attaches to the push for their own downstream tracking (e.g. an upstream ticket id).

Default: null
Responses
200

Success

application/json
post/api/input/content/push
POST /api/input/content/push HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 332

{
  "survey_series_id": "1842",
  "survey_id": "9021",
  "question": {
    "question_id": "31245",
    "content": [
      "The new dashboard is great, but exports are slow.",
      {
        "text": "Support resolved my issue in one call.",
        "external_id": "ticket-58121",
        "customer_id": "cus_310",
        "channel": "support",
        "language": "en",
        "rating": 5,
        "occurred_at": "2026-07-12T09:30:00Z"
      }
    ]
  }
}
{
  "status": "success",
  "survey_series_id": 1842,
  "survey_id": 9021,
  "question_id": 31245,
  "inserted": 2,
  "rows_accepted": 2,
  "aps_deducted": 2,
  "skipped_duplicates": 0,
  "duplicate_external_ids": []
}

Submit a bulk content push (async)

post

Queue a multi-question content batch for async processing. Returns 202 with a task_id and status_url — poll the status endpoint for the final result. Idempotent via Idempotency-Key header (24h window).

Requires permission: push or create or all.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Header parameters
Idempotency-Keystring · max: 255Optional

Opaque retry key (24h window).

Body
survey_series_idstringRequired
survey_idstringRequired
source_referencestring · max: 255 · nullableOptionalDefault: null
Responses
202

Accepted — task queued for async processing

application/json
post/api/input/content/push/bulk
POST /api/input/content/push/bulk HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 203

{
  "survey_series_id": "1842",
  "survey_id": "9021",
  "questions": [
    {
      "question_id": "31245",
      "content": [
        "First comment",
        "Second comment"
      ]
    },
    {
      "question_id": "31246",
      "content": [
        {
          "text": "9",
          "external_id": "rev-4471"
        }
      ]
    }
  ]
}
{
  "status": "accepted",
  "task_id": "3fa2b7c8-6d1e-4f90-9a55-0c8e2d7b4a11",
  "survey_series_id": 1842,
  "survey_id": 9021,
  "status_url": "/api/input/content/push/bulk/status/3fa2b7c8-6d1e-4f90-9a55-0c8e2d7b4a11"
}

Poll the status of a bulk content push

get

Returns 202 while pending/processing, 200 on completed or failed (the discriminator is the status field, not the HTTP code, so the success-vs-recorded-failure path stays machine-readable). 404 when the task id is unknown for the calling org.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Path parameters
task_idstringRequired
Responses
200

Success

application/json
get/api/input/content/push/bulk/status/{task_id}
GET /api/input/content/push/bulk/status/{task_id} HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "task_id": "3fa2b7c8-6d1e-4f90-9a55-0c8e2d7b4a11",
  "status": "completed",
  "progress": 100,
  "progress_message": "Inserted 2400 items",
  "created_at": "2026-07-12T09:31:02Z",
  "completed_at": "2026-07-12T09:31:44Z",
  "survey_series_id": 1842,
  "survey_id": 9021,
  "result": {
    "status": "success",
    "survey_series_id": 1842,
    "survey_id": 9021,
    "total_inserted": 2400,
    "total_rows_accepted": 2412,
    "total_aps_deducted": 2412,
    "questions": [
      {
        "question_id": 31245,
        "inserted": 2398,
        "status": "success"
      },
      {
        "question_id": 31246,
        "inserted": 2,
        "status": "success"
      }
    ]
  }
}

Create a survey inside a series

post

Creates a new survey in EDITING mode with the supplied questions. The survey is not publicly accessible until /survey/publish is called. Question types are case-insensitive.

Requires permission: create or all.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Header parameters
Idempotency-Keystring · min: 1 · max: 255Optional

Opaque client-supplied key for safe POST retries. Repeated requests with the same key within a 24-hour window replay the original response instead of executing the mutation twice. Reusing the same key with a DIFFERENT request body returns 409 IDEMPOTENCY_ERROR. Backed by input_api_idempotency_keys in Postgres.

Example: evt_2025_05_19_a1b2c3
Body
survey_series_idstringRequired
survey_titlestring · min: 1 · max: 100Required
survey_descriptionstring · max: 1000OptionalDefault: ""
feedback_typestringOptional

What kind of feedback this source collects: survey | call_transcript | app_review | support_ticket | chat | email | social_media | review | other. Open vocabulary — new types may be added without a version bump.

Default: survey
languagestring · nullableOptional

EN | FR | ES (or full names; case-insensitive)

Default: null
Responses
201

Created

application/json
post/api/input/survey/create
POST /api/input/survey/create HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 342

{
  "survey_series_id": "1842",
  "survey_title": "Support tickets (CRM sync)",
  "survey_description": "Tickets pushed nightly from our CRM",
  "feedback_type": "support_ticket",
  "language": "en",
  "questions": [
    {
      "question_title": "What was the issue?",
      "question_type": "DEPTH_TEXT"
    },
    {
      "question_title": "How likely are you to recommend us?",
      "question_type": "NPS"
    }
  ]
}
{
  "status": "success",
  "survey_series_id": 1842,
  "survey_id": 9021,
  "feedback_type": "support_ticket",
  "questions_created": 2,
  "questions": [
    {
      "id": 31245,
      "title": "What was the issue?",
      "type": "DEPTH_TEXT"
    },
    {
      "id": 31246,
      "title": "How likely are you to recommend us?",
      "type": "NPS"
    }
  ],
  "message": "Survey 'Support tickets (CRM sync)' created with 2 question(s)"
}

Publish a survey (move to ACCESSIBLE mode)

post

Idempotent: publishing an already-ACCESSIBLE survey is a no-op that returns 200 with the same shape.

Requires permission: create or all.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Header parameters
Idempotency-Keystring · min: 1 · max: 255Optional

Opaque client-supplied key for safe POST retries. Repeated requests with the same key within a 24-hour window replay the original response instead of executing the mutation twice. Reusing the same key with a DIFFERENT request body returns 409 IDEMPOTENCY_ERROR. Backed by input_api_idempotency_keys in Postgres.

Example: evt_2025_05_19_a1b2c3
Body
survey_idintegerRequired
survey_series_idintegerRequired
Responses
200

Success

application/json
post/api/input/survey/publish
POST /api/input/survey/publish HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 42

{
  "survey_id": 9021,
  "survey_series_id": 1842
}
{
  "status": "success",
  "survey_id": 9021,
  "survey_series_id": 1842,
  "mode": "ACCESSIBLE",
  "message": "Survey published successfully"
}

Create a survey series

post

Idempotent on series name within the org — if a series with the same name already exists, returns 200 with created: false and the existing series id.

Requires permission: all.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Header parameters
Idempotency-Keystring · min: 1 · max: 255Optional

Opaque client-supplied key for safe POST retries. Repeated requests with the same key within a 24-hour window replay the original response instead of executing the mutation twice. Reusing the same key with a DIFFERENT request body returns 409 IDEMPOTENCY_ERROR. Backed by input_api_idempotency_keys in Postgres.

Example: evt_2025_05_19_a1b2c3
Body
namestring · min: 2 · max: 255Required

Series display name

Responses
200

Success

application/json
post/api/input/survey_series/create
POST /api/input/survey_series/create HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 30

{
  "name": "Customer Support EU"
}
{
  "status": "success",
  "created": false,
  "message": "Survey series already exists",
  "survey_series": {
    "id": 1842,
    "name": "Customer Support EU"
  }
}

List surveys accessible to the API key's organization

get

API-key-authenticated variant — exposes extended fields (accepts_content, content_format, mode) that the Clerk variant omits, for CLI / integration usage.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Query parameters
survey_series_idstringOptional
survey_idstringOptional
limitinteger · min: 1 · max: 200Optional

Max survey series returned per page.

Default: 50
offsetintegerOptional

Number of series to skip (series-level pagination).

Default: 0
Responses
200

Success

application/json
get/api/input/surveys/list
GET /api/input/surveys/list HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "survey_series": [
    {
      "id": 1842,
      "name": "Customer Support EU",
      "surveys": [
        {
          "id": 9021,
          "title": "Support tickets (CRM sync)",
          "description": "Tickets pushed nightly from our CRM",
          "mode": "ACCESSIBLE",
          "feedback_type": "support_ticket",
          "questions": [
            {
              "id": 31245,
              "title": "What was the issue?",
              "type": "DEPTH_TEXT"
            }
          ]
        }
      ]
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total_count": 1
  }
}

Read processed analysis for a survey

get

The read half of the API: pull sentiment distribution, themes and monitored flags back out once analysis has run on pushed feedback. Flags are monitored at the feedback-group level, so the flags list covers the whole group this survey belongs to. Analysis launches automatically after content lands and takes minutes to tens of minutes depending on volume and queue depth; analysis_status: "none" means no completed run has been persisted yet (it does not distinguish queued from in-progress). Pair with the analysis.completed webhook — registered in the dashboard's Integrations Hub — instead of polling.

Response envelope migration: during the current migration window, 2xx responses carry the bare payload shown in the example (the value of the schema's data property, without the {"data": ...} wrapper). The Deprecation and Sunset headers on every 2xx announce this envelope migration — they do not deprecate the endpoint itself. After the Sunset date, responses will be wrapped as {"data": ...} exactly as the schema declares.

Authorizations
AuthorizationstringRequired

API key authentication: pass your key in the Authorization header as Bearer inpk_live_... (or inpk_test_... for a test-environment key). Create and manage keys in the dashboard under Integrations Hub -> API Keys. Each key carries a permission scope (push, create, send, mcp_read, or all) and a per-minute rate limit.

Path parameters
survey_idinteger · int64Required
Responses
200

Success

application/json
get/api/input/surveys/{survey_id}/analysis
GET /api/input/surveys/{survey_id}/analysis HTTP/1.1
Host: app.boundary-ai.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "survey_id": 9021,
  "survey_series_id": 1842,
  "feedback_type": "support_ticket",
  "analysis_id": 55710,
  "analysis_status": "available",
  "sentiment_distribution": {
    "veryPositive": 312,
    "positive": 540,
    "neutral": 205,
    "negative": 118,
    "veryNegative": 42
  },
  "themes": [
    {
      "name": "Response time",
      "mentions": 214,
      "avg_sentiment": -0.31,
      "description": "Waiting time before the first reply"
    }
  ],
  "flags": [
    {
      "name": "Churn risk",
      "mentions": 17,
      "avg_sentiment": -0.62,
      "summary": "Accounts describing an intent to cancel",
      "scope": "survey_series"
    }
  ]
}

Last updated