From 896b059e2f789d0bceaafd2306feaa6232658db0 Mon Sep 17 00:00:00 2001 From: Pablo Sanabria Date: Thu, 5 Sep 2024 06:26:32 -0400 Subject: [PATCH 01/25] Added List and List Objects CRUD docs --- source/index.html.md | 426 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 377 insertions(+), 49 deletions(-) diff --git a/source/index.html.md b/source/index.html.md index c91c909865e..92570e124e6 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -355,6 +355,7 @@ require 'json' url = 'https://www.mydatascope.com/api/external/locations' response = RestClient.post url, { + location: { name: "Test Location", description: "This is a test location created by API", code: "LOC_TEST01", @@ -367,6 +368,7 @@ response = RestClient.post url, { longitude: 151.285829, phone: "+18888888", email: "location@test.com" + } }.to_json, { :Authorization => 'b1cd93mfls9fdmfkadn23', :params => {} @@ -379,18 +381,20 @@ curl "https://www.mydatascope.com/api/external/locations" -H "Authorization: b1cd93mfls9fdmfkadn23" -X POST -d '{ - "name": "Test Location", - "description": "This is a test location created by API", - "code": "LOC_TEST01", - "company_code": "DSCODE_1", - "company_name": "Datascope Home", - "address": "P. Sherman, 42 Wallaby Way", - "city": "Sydney", - "country": "Australia", - "latitude": -33.673992, - "longitude": 151.285829, - "phone": "+18888888", - "email": "location@test.com" + "location": { + "name": "Test Location", + "description": "This is a test location created by API", + "code": "LOC_TEST01", + "company_code": "DSCODE_1", + "company_name": "Datascope Home", + "address": "P. Sherman, 42 Wallaby Way", + "city": "Sydney", + "country": "Australia", + "latitude": -33.673992, + "longitude": 151.285829, + "phone": "+18888888", + "email": "location@test.com" + } }' ``` @@ -440,18 +444,18 @@ email | String | Email of the Company ### Return Codes: -``` -201: Successfull -403: Forbidden -422: Wrong parameters, check documentation -``` +Code | Description +---- | ----------- +201 | Successfull +403 | Forbidden +422 | Wrong parameters, check documentation -## Create a Location +## Update a Location ```ruby require 'rest-client' @@ -459,18 +463,20 @@ require 'json' url = 'https://www.mydatascope.com/api/external/locations/123456' response = RestClient.post url, { - name: "Test Location", - description: "This is a test location created by API", - code: "LOC_TEST01", - company_code: "DSCODE_1", - company_name: "Datascope Home", - address: "P. Sherman, 42 Wallaby Way", - city: "Sydney", - country: "Australia", - latitude: -33.673992, - longitude: 151.285829, - phone: "+18888888", - email: "location@test.com" + location: { + name: "Test Location", + description: "This is a test location created by API", + code: "LOC_TEST01", + company_code: "DSCODE_1", + company_name: "Datascope Home", + address: "P. Sherman, 42 Wallaby Way", + city: "Sydney", + country: "Australia", + latitude: -33.673992, + longitude: 151.285829, + phone: "+18888888", + email: "location@test.com" + } }.to_json, { :Authorization => 'b1cd93mfls9fdmfkadn23', :params => {} @@ -483,18 +489,20 @@ curl "https://www.mydatascope.com/api/external/locations/123456" -H "Authorization: b1cd93mfls9fdmfkadn23" -X POST -d '{ - "name": "Test Location", - "description": "This is a test location created by API", - "code": "LOC_TEST01", - "company_code": "DSCODE_1", - "company_name": "Datascope Home", - "address": "P. Sherman, 42 Wallaby Way", - "city": "Sydney", - "country": "Australia", - "latitude": -33.673992, - "longitude": 151.285829, - "phone": "+18888888", - "email": "location@test.com" + "location": { + "name": "Test Location", + "description": "This is a test location created by API", + "code": "LOC_TEST01", + "company_code": "DSCODE_1", + "company_name": "Datascope Home", + "address": "P. Sherman, 42 Wallaby Way", + "city": "Sydney", + "country": "Australia", + "latitude": -33.673992, + "longitude": 151.285829, + "phone": "+18888888", + "email": "location@test.com" + } }' ``` @@ -519,7 +527,7 @@ curl "https://www.mydatascope.com/api/external/locations/123456" ``` -This endpoint create a location +This endpoint updates a location ### HTTP Request @@ -544,12 +552,11 @@ email | String | Email of the Company ### Return Codes: -``` -200: Successfull -403: Forbidden -404: Not found -422: Wrong parameters, check documentation -``` +Code | Description +---- | ----------- +201 | Successfull +403 | Forbidden +422 | Wrong parameters, check documentation + +## Bulk Update List Elements + +```ruby +require 'rest-client' +require 'json' + +url = 'https://www.mydatascope.com/api/external/metadata_objects/bulk_update' +response = RestClient.post url, { + metadata_type: "DATASCOPE_SAFETY_LIST_CODE", + objects: [ + { + code: "PPE001", + name: "Helmet", + description: "Safety helmet in good condition", + attribute1: "Mandatory", + attribute2: "Daily check" + }, + { + code: "PPE002", + name: "Boots", + description: "Steel-toed safety boots", + attribute1: "Mandatory", + attribute2: "Check for wear" + }, + { + code: "PPE003", + name: "Glasses", + description: "Safety glasses with side shields", + attribute1: "Mandatory", + attribute2: "Clean daily" + } + ] +}.to_json, { + :Authorization => 'b1cd93mfls9fdmfkadn23', + :params => {} +} +JSON.parse(response) +``` + +```shell +curl "https://www.mydatascope.com/api/external/metadata_objects/bulk_update" + -H "Authorization: b1cd93mfls9fdmfkadn23" + -X POST + -d '{ + "metadata_type": "DATASCOPE_SAFETY_LIST_CODE", + "objects": [ + { + "code": "PPE001", + "name": "Helmet", + "description": "Safety helmet in good condition", + "attribute1": "Mandatory", + "attribute2": "Daily check" + }, + { + "code": "PPE002", + "name": "Boots", + "description": "Steel-toed safety boots", + "attribute1": "Mandatory", + "attribute2": "Check for wear" + }, + { + "code": "PPE003", + "name": "Glasses", + "description": "Safety glasses with side shields", + "attribute1": "Mandatory", + "attribute2": "Clean daily" + } + ] + }' +``` + +> When successful, the above command returns JSON structured like this: + +```json +{ + "message": "List successfully updated", + "deleted_count": 2, + "created_count": 2 +} +``` + +This endpoint updates multiple list objects in bulk. + +### HTTP Request + +`POST https://www.mydatascope.com/api/external/metadata_objects/bulk_update` + +### Input Parameters + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| metadata_type | String | Internal code to identify the list | +| objects | Array | An array of objects to be updated or created | + +### Object Structure + +Each object in the `objects` array should have the following structure: + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| code | String | Internal code of the list element | +| name | String | Name of the list element | +| description | String | Description of the list element | +| attribute1 | String | Custom attribute of the list element | +| attribute2 | String | Custom attribute of the list element | + +### Return Codes + +| Code | Description | +| ---- | ----------- | +| 200 | Successful | +| 403 | Forbidden | +| 422 | Wrong parameters, check documentation | +| 500 | Internal Server Error | + +### Response + +The response includes: + +| Field | Type | Description | +| ----- | ---- | ----------- | +| message | String | A success message | +| deleted_count | Integer | Number of objects deleted in the process | +| created_count | Integer | Number of objects created or updated | + +> Remember — use your own Authorization header + +**Warning:** This operation will delete all existing objects for the specified metadata_type and replace them with the new objects provided. + + # Task Assigns ## Create Task Assign From 5b95fff131c791832216888c463e0b2f50511300 Mon Sep 17 00:00:00 2001 From: dotconde Date: Mon, 28 Oct 2024 02:48:55 -0500 Subject: [PATCH 03/25] refine documentation --- source/index.html.md | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/source/index.html.md b/source/index.html.md index 6cd39191fde..49928b23e52 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -1027,6 +1027,8 @@ Remember — user your own header Authorization ## Bulk Update List Elements +This endpoint allows bulk updating of metadata list objects, with soft deletion of objects not in the incoming list. + ```ruby require 'rest-client' require 'json' @@ -1100,9 +1102,12 @@ curl "https://www.mydatascope.com/api/external/metadata_objects/bulk_update" ```json { - "message": "List successfully updated", - "deleted_count": 2, - "created_count": 2 + "id": 1, + "name": "Safety List", + "description": "List for safety equipment", + "code": "DATASCOPE_SAFETY_LIST_CODE", + "list_type": "safety", + "length": 3 } ``` @@ -1116,12 +1121,12 @@ This endpoint updates multiple list objects in bulk. | Parameter | Type | Description | | --------- | ---- | ----------- | -| metadata_type | String | Internal code to identify the list | -| objects | Array | An array of objects to be updated or created | +| metadata_type | String | Internal code to identify the list (must not be "locations") | +| list_objects | Array | Array of objects to be created or updated | -### Object Structure +### List Object Structure -Each object in the `objects` array should have the following structure: +Each object in the `list_objects` array should have the following structure: | Parameter | Type | Description | | --------- | ---- | ----------- | @@ -1136,6 +1141,7 @@ Each object in the `objects` array should have the following structure: | Code | Description | | ---- | ----------- | | 200 | Successful | +| 400 | Bad Request if metadata_type is `locations` | | 403 | Forbidden | | 422 | Wrong parameters, check documentation | | 500 | Internal Server Error | @@ -1146,13 +1152,18 @@ The response includes: | Field | Type | Description | | ----- | ---- | ----------- | -| message | String | A success message | -| deleted_count | Integer | Number of objects deleted in the process | -| created_count | Integer | Number of objects created or updated | +| id | Integer | ID of the updated list | +| name | String | Name of the updated list | +| description | String | Description of the updated list | +| code | String | Code for the updated list | +| list_type | String | Type of the list | +| length | Integer | Number of active list objects | -> Remember — use your own Authorization header + -**Warning:** This operation will delete all existing objects for the specified metadata_type and replace them with the new objects provided. +> **Warning**: This operation will delete all existing objects for the specified metadata_type and replace them with the new objects provided. This endpoint is currently in an **experimental stage**. Changes may be made to functionality or structure as we continue testing and refining its implementation. Use with caution, and consider testing thoroughly in your environment before relying on it in production. # Task Assigns From ceb176e6fbda5822f5d7ea6fc0d1f6fed99d7971 Mon Sep 17 00:00:00 2001 From: Deyvi Conde Date: Tue, 29 Oct 2024 16:26:19 -0500 Subject: [PATCH 04/25] improve bulk list update documentation (#2) --- source/index.html.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/source/index.html.md b/source/index.html.md index 49928b23e52..5382c4b351f 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -1027,7 +1027,9 @@ Remember — user your own header Authorization ## Bulk Update List Elements -This endpoint allows bulk updating of metadata list objects, with soft deletion of objects not in the incoming list. +This endpoint allows bulk updating of metadata list objects, with soft deletion of objects not in the incoming list. If an object with an existing code is provided, it will be updated. If a new code is used, the object will be created. + +> **Warning**: This operation will delete all existing objects for the specified metadata_type and replace them with the new objects provided. This endpoint is currently in an **experimental stage**. Changes may be made to functionality or structure as we continue testing and refining its implementation. ```ruby require 'rest-client' @@ -1036,7 +1038,7 @@ require 'json' url = 'https://www.mydatascope.com/api/external/metadata_objects/bulk_update' response = RestClient.post url, { metadata_type: "DATASCOPE_SAFETY_LIST_CODE", - objects: [ + list_objects: [ { code: "PPE001", name: "Helmet", @@ -1072,7 +1074,7 @@ curl "https://www.mydatascope.com/api/external/metadata_objects/bulk_update" -X POST -d '{ "metadata_type": "DATASCOPE_SAFETY_LIST_CODE", - "objects": [ + "list_objects": [ { "code": "PPE001", "name": "Helmet", @@ -1111,8 +1113,6 @@ curl "https://www.mydatascope.com/api/external/metadata_objects/bulk_update" } ``` -This endpoint updates multiple list objects in bulk. - ### HTTP Request `POST https://www.mydatascope.com/api/external/metadata_objects/bulk_update` @@ -1163,9 +1163,6 @@ The response includes: Remember — user your own header Authorization -> **Warning**: This operation will delete all existing objects for the specified metadata_type and replace them with the new objects provided. This endpoint is currently in an **experimental stage**. Changes may be made to functionality or structure as we continue testing and refining its implementation. Use with caution, and consider testing thoroughly in your environment before relying on it in production. - - # Task Assigns ## Create Task Assign From 8bb5f74a8210cf4cc5402aabdff50662f7e7bef5 Mon Sep 17 00:00:00 2001 From: Deyvi Conde Date: Thu, 5 Dec 2024 07:57:48 -0500 Subject: [PATCH 05/25] update bulk list update docs (#3) --- source/index.html.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/source/index.html.md b/source/index.html.md index 5382c4b351f..de80650be42 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -1037,7 +1037,8 @@ require 'json' url = 'https://www.mydatascope.com/api/external/metadata_objects/bulk_update' response = RestClient.post url, { - metadata_type: "DATASCOPE_SAFETY_LIST_CODE", + metadata_type: "your_list_code", + name: "Safety Equipment List", list_objects: [ { code: "PPE001", @@ -1062,7 +1063,7 @@ response = RestClient.post url, { } ] }.to_json, { - :Authorization => 'b1cd93mfls9fdmfkadn23', + :Authorization => '', :params => {} } JSON.parse(response) @@ -1070,10 +1071,11 @@ JSON.parse(response) ```shell curl "https://www.mydatascope.com/api/external/metadata_objects/bulk_update" - -H "Authorization: b1cd93mfls9fdmfkadn23" + -H "Authorization: " -X POST -d '{ - "metadata_type": "DATASCOPE_SAFETY_LIST_CODE", + "metadata_type": "your_list_code", + "name": "Safety Equipment List", "list_objects": [ { "code": "PPE001", @@ -1105,10 +1107,10 @@ curl "https://www.mydatascope.com/api/external/metadata_objects/bulk_update" ```json { "id": 1, - "name": "Safety List", + "name": "Safety Equipment List", "description": "List for safety equipment", - "code": "DATASCOPE_SAFETY_LIST_CODE", - "list_type": "safety", + "code": "your_list_code", + "list_type": "standard", "length": 3 } ``` @@ -1122,6 +1124,7 @@ curl "https://www.mydatascope.com/api/external/metadata_objects/bulk_update" | Parameter | Type | Description | | --------- | ---- | ----------- | | metadata_type | String | Internal code to identify the list (must not be "locations") | +| name | String | Name of the list to be created or updated | | list_objects | Array | Array of objects to be created or updated | ### List Object Structure From 5b59678d3206c9cff1686a014f27150cfa995a98 Mon Sep 17 00:00:00 2001 From: Felipe Rojos Date: Wed, 12 Mar 2025 17:31:45 -0300 Subject: [PATCH 06/25] update logo --- source/images/logo.png | Bin 21752 -> 164979 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source/images/logo.png b/source/images/logo.png index fd45dc8f99559c6f6b1baad40696e00e5d173aae..27f077a35d29b756a0bded197c40fe09d1473408 100644 GIT binary patch literal 164979 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

xzAg!+naJCRX1zjrhE$&0 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%0ADV$MFqCSb1CFL^qIi_dxqj+6@IFwZSMR3l-Y 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 literal 21752 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 k32qQRsaA1 From 0e1b445d29480ba79e21ce9fd63158676b2db2dd Mon Sep 17 00:00:00 2001 From: Felipe Rojos Date: Wed, 12 Mar 2025 17:41:07 -0300 Subject: [PATCH 07/25] Update GitHub Actions workflows to use actions/cache@v3 and standardize branch syntax --- .github/workflows/build.yml | 54 ++++++++++++++++---------------- .github/workflows/deploy.yml | 50 ++++++++++++++--------------- .github/workflows/dev_deploy.yml | 52 +++++++++++++++--------------- 3 files changed, 78 insertions(+), 78 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a665d58ee3a..10076935a20 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,9 +2,9 @@ name: Build on: push: - branches: [ '*' ] + branches: ["*"] pull_request: - branches: [ '*' ] + branches: ["*"] jobs: test: @@ -15,28 +15,28 @@ jobs: ruby-version: [2.3, 2.4, 2.5, 2.6] steps: - - uses: actions/checkout@v2 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ matrix.ruby-version }} - - - uses: actions/cache@v2 - with: - path: vendor/bundle - key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - gems-${{ runner.os }}-${{ matrix.ruby-version }}- - gems-${{ runner.os }}- - - # necessary to get ruby 2.3 to work nicely with bundler vendor/bundle cache - # can remove once ruby 2.3 is no longer supported - - run: gem update --system 3.3.27 - - - run: bundle config set deployment 'true' - - name: bundle install - run: | - bundle config path vendor/bundle - bundle install --jobs 4 --retry 3 - - - run: bundle exec middleman build + - uses: actions/checkout@v2 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby-version }} + + - uses: actions/cache@v3 + with: + path: vendor/bundle + key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} + restore-keys: | + gems-${{ runner.os }}-${{ matrix.ruby-version }}- + gems-${{ runner.os }}- + + # necessary to get ruby 2.3 to work nicely with bundler vendor/bundle cache + # can remove once ruby 2.3 is no longer supported + - run: gem update --system 3.3.27 + + - run: bundle config set deployment 'true' + - name: bundle install + run: | + bundle config path vendor/bundle + bundle install --jobs 4 --retry 3 + + - run: bundle exec middleman build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 341cd5f7fbc..451af2a9c20 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,7 +2,7 @@ name: Deploy on: push: - branches: [ 'main' ] + branches: ["main"] jobs: deploy: @@ -11,31 +11,31 @@ jobs: ruby-version: 2.5 steps: - - uses: actions/checkout@v2 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ env.ruby-version }} + - uses: actions/checkout@v2 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ env.ruby-version }} - - uses: actions/cache@v2 - with: - path: vendor/bundle - key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - gems-${{ runner.os }}-${{ matrix.ruby-version }}- - gems-${{ runner.os }}- + - uses: actions/cache@v3 + with: + path: vendor/bundle + key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} + restore-keys: | + gems-${{ runner.os }}-${{ matrix.ruby-version }}- + gems-${{ runner.os }}- - - run: bundle config set deployment 'true' - - name: bundle install - run: | - bundle config path vendor/bundle - bundle install --jobs 4 --retry 3 + - run: bundle config set deployment 'true' + - name: bundle install + run: | + bundle config path vendor/bundle + bundle install --jobs 4 --retry 3 - - run: bundle exec middleman build + - run: bundle exec middleman build - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./build - keep_files: true + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build + keep_files: true diff --git a/.github/workflows/dev_deploy.yml b/.github/workflows/dev_deploy.yml index 5a655b8ced8..4d8943ad8cf 100644 --- a/.github/workflows/dev_deploy.yml +++ b/.github/workflows/dev_deploy.yml @@ -2,7 +2,7 @@ name: Dev Deploy on: push: - branches: [ 'dev' ] + branches: ["dev"] jobs: deploy: @@ -11,32 +11,32 @@ jobs: ruby-version: 2.5 steps: - - uses: actions/checkout@v2 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ env.ruby-version }} + - uses: actions/checkout@v2 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ env.ruby-version }} - - uses: actions/cache@v2 - with: - path: vendor/bundle - key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - gems-${{ runner.os }}-${{ matrix.ruby-version }}- - gems-${{ runner.os }}- + - uses: actions/cache@v3 + with: + path: vendor/bundle + key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }} + restore-keys: | + gems-${{ runner.os }}-${{ matrix.ruby-version }}- + gems-${{ runner.os }}- - - run: bundle config set deployment 'true' - - name: bundle install - run: | - bundle config path vendor/bundle - bundle install --jobs 4 --retry 3 + - run: bundle config set deployment 'true' + - name: bundle install + run: | + bundle config path vendor/bundle + bundle install --jobs 4 --retry 3 - - run: bundle exec middleman build + - run: bundle exec middleman build - - name: Deploy - uses: peaceiris/actions-gh-pages@v3.7.0-8 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - destination_dir: dev - publish_dir: ./build - keep_files: true + - name: Deploy + uses: peaceiris/actions-gh-pages@v3.7.0-8 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + destination_dir: dev + publish_dir: ./build + keep_files: true From e967313b63e716da8e45bca35b07fae17a855352 Mon Sep 17 00:00:00 2001 From: jose-richard-91 Date: Thu, 26 Mar 2026 15:42:58 -0300 Subject: [PATCH 08/25] =?UTF-8?q?docs(DS-2757):=20documentaci=C3=B3n=20API?= =?UTF-8?q?=20externa=20task=20assigns=20index=20&=20show=20(#11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(DS-2757): add GET /api/external/task_assigns/:id endpoint documentation Documents the show endpoint for task assignments, including path parameters, all 30 response fields with types and descriptions, and shell/ruby examples. Co-Authored-By: Claude Sonnet 4.6 * add index documentation * docs(DS-2757): update status values and add note about default date behavior - Replace `sent`/`in_progress` with `assigned`/`accepted` in status fields - Clarify that without date filters the API returns all historical tasks - Note that the platform UI applies a default ±7-day window Co-Authored-By: Claude Opus 4.6 * docs(DS-2757): rename form_answer_code to response_code and add priority field - Rename `form_answer_code` to `response_code` to match Google Sheet naming - Add `priority` field to response examples and field tables - Updated in both Show and Index endpoint sections Co-Authored-By: Claude Opus 4.6 * rename: datetime_start/datetime_end to response_start/response_end Aligns field names with the API naming convention (noun_qualifier) and matches the backend rename in datascope-rails. Addresses review comment by @Tailmon on lines 1284, 1334, 1456 Co-Authored-By: Claude Opus 4.6 (1M context) --------- Co-authored-by: Claude Sonnet 4.6 --- source/index.html.md | 234 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) diff --git a/source/index.html.md b/source/index.html.md index de80650be42..4ffdcab133a 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -1232,6 +1232,240 @@ code | String | Code to identify the task Remember — user your own header Authorization +## Get Task Assign by ID + +```shell +curl "https://www.mydatascope.com/api/external/task_assigns/4821" \ + -H "Authorization: b1cd93mfls9fdmfkadn23" +``` + +```ruby +require 'rest-client' +require 'json' + +url = 'https://www.mydatascope.com/api/external/task_assigns/4821' +response = RestClient.get url, { + :Authorization => 'b1cd93mfls9fdmfkadn23' +} +JSON.parse(response) +``` + +> The above command returns JSON structured like this, you can check the description of each parameter below: + +```json +{ + "id": 4821, + "assign_id": "TA-2024-001", + "response_code": "FA-0099", + "priority": 1, + "start_time": "2025-03-10 09:00:00", + "form_name": "Safety Inspection", + "user_email": "inspector@company.com", + "description": "Monthly fire extinguisher check", + "location_name": "Main Warehouse", + "location_code": "WH-001", + "location_type": "Location", + "location_address": "123 Main Ave", + "location_email": "warehouse@company.com", + "location_phone": "+1-555-0100", + "gap": 2, + "checklist": "Check extinguisher,Verify seal,Sign log", + "location_latitude": -33.4489, + "location_longitude": -70.6693, + "completed": "Yes", + "on_time": "Yes", + "delay_time": "0d/00h/00m", + "completed_datetime": "2025-03-10 10:45:00", + "late_response_allowed": false, + "mandatory": "for_everyone", + "confirmation_status": "completed", + "status": "completed", + "time_to_perform_minutes": 105.5, + "response_start": "2025-03-10 09:05:00", + "response_end": "2025-03-10 10:45:00", + "created_at": "2025-03-01 08:00:00", + "created_by": "Admin User" +} +``` + +This endpoint retrieves the full detail of a single task assignment by its internal ID. Returns the same fields as the list endpoint. Returns 404 if the assignment does not belong to the authenticated account. + +### HTTP Request + +`GET https://www.mydatascope.com/api/external/task_assigns/:id` + +### Path Parameters + +Parameter | Type | Description +--------- | ------- | ----------- +id | Integer | Internal database ID of the task assignment + +### Response Fields + +Field | Type | Description +--------- | ------- | ----------- +id | Integer | Internal database ID — unique across all periods +assign_id | String | User-defined task code — may repeat across periods +response_code | String | Code of the submitted form answer, if completed +priority | Integer | Task priority level (set when creating the task) +start_time | String | Scheduled start time (account timezone) +form_name | String | Name of the associated form +user_email | String | Email of the assigned inspector +description | String | Task description or instructions +location_name | String | Name of the location +location_code | String | Code of the location +location_type | String | `Location` or `NestableLocation` +location_address | String | Address of the location +location_email | String | Email of the location +location_phone | String | Phone of the location +gap | Integer | Estimated hours to perform the task +checklist | String | Comma-separated checklist items +location_latitude | Float | Latitude of the location +location_longitude | Float | Longitude of the location +completed | String | `Yes` if a form answer exists, `No` otherwise +on_time | String | `Yes` if completed before deadline, `No` if late, `null` if not completed +delay_time | String | Delay formatted as `Xd/HHh/MMm`. `null` if not completed +completed_datetime | String | When the last answer was submitted (account timezone) +late_response_allowed | Boolean | Whether late submissions are permitted +mandatory | String | `for_nobody`, `for_one`, or `for_everyone` +confirmation_status | String | Acceptance state: `required`, `accepted`, `rejected`, `completed`, or `null` +status | String | Task state: `completed`, `incomplete`, `assigned`, `accepted`, or `rejected` +time_to_perform_minutes | Float | Minutes between first and last answer submission. `null` if not completed +response_start | String | When the first answer was submitted (account timezone) +response_end | String | When the last answer was submitted (account timezone) +created_at | String | When the task assignment was created (account timezone) +created_by | String | Full name of the user who created the task assignment + +

+ +## Get Task Assigns by Period + +```shell +curl "https://www.mydatascope.com/api/external/task_assigns?start_date=2025-03-01&end_date=2025-03-31" \ + -H "Authorization: b1cd93mfls9fdmfkadn23" +``` + +```ruby +require 'rest-client' +require 'json' + +url = 'https://www.mydatascope.com/api/external/task_assigns' +response = RestClient.get url, { + :Authorization => 'b1cd93mfls9fdmfkadn23', + :params => { start_date: '2025-03-01', end_date: '2025-03-31' } +} +JSON.parse(response) +``` + +> The above command returns JSON structured like this, you can check the description of each parameter below: + +```json +{ + "task_assigns": [ + { + "id": 4821, + "assign_id": "TA-2024-001", + "response_code": "FA-0099", + "priority": 1, + "start_time": "2025-03-10 09:00:00", + "form_name": "Safety Inspection", + "user_email": "inspector@company.com", + "description": "Monthly fire extinguisher check", + "location_name": "Main Warehouse", + "location_code": "WH-001", + "location_type": "Location", + "location_address": "123 Main Ave", + "location_email": "warehouse@company.com", + "location_phone": "+1-555-0100", + "gap": 2, + "checklist": "Check extinguisher,Verify seal,Sign log", + "location_latitude": -33.4489, + "location_longitude": -70.6693, + "completed": "Yes", + "on_time": "Yes", + "delay_time": "0d/00h/00m", + "completed_datetime": "2025-03-10 10:45:00", + "late_response_allowed": false, + "mandatory": "for_everyone", + "confirmation_status": "completed", + "status": "completed", + "time_to_perform_minutes": 105.5, + "response_start": "2025-03-10 09:05:00", + "response_end": "2025-03-10 10:45:00", + "created_at": "2025-03-01 08:00:00", + "created_by": "Admin User" + } + ], + "total": 1, + "limit": 100, + "offset": 0 +} +``` + +This endpoint retrieves a paginated list of task assignments for the authenticated account. The response fields match the platform's Excel export plus the internal `id`, enabling automated integrations without manual downloads. The `total` field reflects the number of task assignments matching the applied filters — without filters, it returns the count of all historical tasks in the account. + +### HTTP Request + +`GET https://www.mydatascope.com/api/external/task_assigns` + +### Input Parameters + +Parameter | Type | Description +--------- | ------- | ----------- +start_date | String | Optional. Start date in `YYYY-MM-DD` format. Filters by `start_time >= date` +end_date | String | Optional. End date in `YYYY-MM-DD` format. Filters by `start_time <= date` +status | String | Optional. Filter by status: `completed`, `incomplete`, `assigned`, `accepted`, `rejected` +location_id | Integer | Optional. Filter by location ID +user_email | String | Optional. Filter by the assigned inspector's email +limit | Integer | Optional. Max number of results to return. Default: 100, max: 300 +offset | Integer | Optional. Number of results to skip (for pagination). Default: 0 + +### Response Fields + +Field | Type | Description +--------- | ------- | ----------- +id | Integer | Internal database ID — unique across all periods +assign_id | String | User-defined task code — may repeat across periods +response_code | String | Code of the submitted form answer, if completed +priority | Integer | Task priority level (set when creating the task) +start_time | String | Scheduled start time (account timezone) +form_name | String | Name of the associated form +user_email | String | Email of the assigned inspector +description | String | Task description or instructions +location_name | String | Name of the location +location_code | String | Code of the location +location_type | String | `Location` or `NestableLocation` +location_address | String | Address of the location +location_email | String | Email of the location +location_phone | String | Phone of the location +gap | Integer | Estimated hours to perform the task +checklist | String | Comma-separated checklist items +location_latitude | Float | Latitude of the location +location_longitude | Float | Longitude of the location +completed | String | `Yes` if a form answer exists, `No` otherwise +on_time | String | `Yes` if completed before deadline, `No` if late, `null` if not completed +delay_time | String | Delay formatted as `Xd/HHh/MMm`. `null` if not completed +completed_datetime | String | When the last answer was submitted (account timezone) +late_response_allowed | Boolean | Whether late submissions are permitted +mandatory | String | `for_nobody`, `for_one`, or `for_everyone` +confirmation_status | String | Acceptance state: `required`, `accepted`, `rejected`, `completed`, or `null` +status | String | Task state: `completed`, `incomplete`, `assigned`, `accepted`, or `rejected` +time_to_perform_minutes | Float | Minutes between first and last answer submission. `null` if not completed +response_start | String | When the first answer was submitted (account timezone) +response_end | String | When the last answer was submitted (account timezone) +created_at | String | When the task assignment was created (account timezone) +created_by | String | Full name of the user who created the task assignment + + + + + # Notifications ## List Last notifications From f2ee32d7abb9f8cfcedb116c1867c7694f4efb5b Mon Sep 17 00:00:00 2001 From: jose-richard-91 Date: Mon, 30 Mar 2026 10:32:10 -0300 Subject: [PATCH 09/25] docs(DS-2757): rename start_date/end_date to start/end (#13) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(DS-2757): add GET /api/external/task_assigns/:id endpoint documentation Documents the show endpoint for task assignments, including path parameters, all 30 response fields with types and descriptions, and shell/ruby examples. Co-Authored-By: Claude Sonnet 4.6 * add index documentation * docs(DS-2757): update status values and add note about default date behavior - Replace `sent`/`in_progress` with `assigned`/`accepted` in status fields - Clarify that without date filters the API returns all historical tasks - Note that the platform UI applies a default ±7-day window Co-Authored-By: Claude Opus 4.6 * docs(DS-2757): rename form_answer_code to response_code and add priority field - Rename `form_answer_code` to `response_code` to match Google Sheet naming - Add `priority` field to response examples and field tables - Updated in both Show and Index endpoint sections Co-Authored-By: Claude Opus 4.6 * rename: datetime_start/datetime_end to response_start/response_end Aligns field names with the API naming convention (noun_qualifier) and matches the backend rename in datascope-rails. Addresses review comment by @Tailmon on lines 1284, 1334, 1456 Co-Authored-By: Claude Opus 4.6 (1M context) * docs(DS-2757): rename start_date/end_date params to start/end Align task assigns API docs with updated parameter names for consistency with internal v1 API conventions. Co-Authored-By: Claude Opus 4.6 (1M context) --------- Co-authored-by: Claude Sonnet 4.6 --- source/index.html.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/index.html.md b/source/index.html.md index 4ffdcab133a..2bd6bdd703a 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -1343,7 +1343,7 @@ Remember — use your own Authorization header ## Get Task Assigns by Period ```shell -curl "https://www.mydatascope.com/api/external/task_assigns?start_date=2025-03-01&end_date=2025-03-31" \ +curl "https://www.mydatascope.com/api/external/task_assigns?start=2025-03-01&end=2025-03-31" \ -H "Authorization: b1cd93mfls9fdmfkadn23" ``` @@ -1354,7 +1354,7 @@ require 'json' url = 'https://www.mydatascope.com/api/external/task_assigns' response = RestClient.get url, { :Authorization => 'b1cd93mfls9fdmfkadn23', - :params => { start_date: '2025-03-01', end_date: '2025-03-31' } + :params => { start: '2025-03-01', end: '2025-03-31' } } JSON.parse(response) ``` @@ -1414,8 +1414,8 @@ This endpoint retrieves a paginated list of task assignments for the authenticat Parameter | Type | Description --------- | ------- | ----------- -start_date | String | Optional. Start date in `YYYY-MM-DD` format. Filters by `start_time >= date` -end_date | String | Optional. End date in `YYYY-MM-DD` format. Filters by `start_time <= date` +start | String | Optional. Start date in `YYYY-MM-DD` format. Filters by `start_time >= date` +end | String | Optional. End date in `YYYY-MM-DD` format. Filters by `start_time <= date` status | String | Optional. Filter by status: `completed`, `incomplete`, `assigned`, `accepted`, `rejected` location_id | Integer | Optional. Filter by location ID user_email | String | Optional. Filter by the assigned inspector's email From 9a6deb472dd2f23ab4892a1bb9aaa8f1cb963895 Mon Sep 17 00:00:00 2001 From: jose-richard-91 Date: Wed, 1 Apr 2026 15:50:42 -0300 Subject: [PATCH 10/25] DS-2756: Add GET Findings (Index & Show) API documentation (#12) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(DS-2756): Add GET /api/external/findings endpoint documentation Co-Authored-By: Claude Sonnet 4.6 * docs(DS-2756): Add pagination explanation to findings index endpoint * docs(DS-2756): Add task_form_id filter to findings index endpoint Co-Authored-By: Claude Sonnet 4.6 * docs(DS-2756): update findings index endpoint documentation - Replace location_name with location + nestable_location fields - Replace form_answer_id with form_answer_code - Fix date format description (account-preference formatted string, not ISO 8601) - Add max values for limit (200) and offset (10000) parameters Co-Authored-By: Claude Sonnet 4.6 * docs: align index endpoint documentation with implementation - Update JSON example: location_id/name/code, structured assignees/invitees, creator_id/email, assignees_concatenated, invitees_concatenated, form_answer_id - Fix type field description: resolved name, not raw ID - Fix offset max: 10000 → 2000 (matches MAX_OFFSET constant) - Fix return codes: 403 → 401 Unauthorized - Add asset_name, asset_identifier to response fields table Co-Authored-By: Claude Sonnet 4.6 * finding GET documentation * fix(DS-2756): update findings endpoints to renamed routes - GET findings/list (was /findings) - GET findings/get/:id (was /findings/:id) Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- source/index.html.md | 232 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 231 insertions(+), 1 deletion(-) diff --git a/source/index.html.md b/source/index.html.md index 2bd6bdd703a..be6fd6d4622 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -1631,5 +1631,235 @@ To configure the webhook you need to go to the Integrations section and then Web ``` + + +# Tickets (FKA Issues) + +## Get Tickets by Period + +```shell +curl "https://www.mydatascope.com/api/external/findings/list?start=01-01-2026&end=31-01-2026" + -H "Authorization: b1cd93mfls9fdmfkadn23" +``` + +```ruby +require 'rest-client' +require 'json' + +url = 'https://www.mydatascope.com/api/external/findings/list' +response = RestClient.get url, { +:Authorization => 'b1cd93mfls9fdmfkadn23', + :params => { start: '01-01-2026', end: '31-01-2026' } +} +JSON.parse(response) +``` + +> The above command returns JSON structured like this, you can check the description of each parameter below: + +```json +[ + { + "id": "Krdz3aFoWZ4ZVgpuAart", + "code": 1, + "name": "ejemplo", + "description": "Ejemplo", + "type": "Safety", + "status": "closed", + "priority": "high", + "creation_date": "30/01/2026 19:53", + "expiration_date": "23/01/2026 19:53", + "closure_date": "05/02/2026 15:23", + "closure_message": "Addressed", + "location_id": 42, + "location_name": "Main Office", + "location_code": "LOC-001", + "asset_name": null, + "asset_identifier": null, + "creator_id": 7, + "creator_email": "juan.perez@example.com", + "creator_name": "Juan Perez", + "assignees_concatenated": "user_id:7;;email:juan.perez@example.com;;name:Juan Perez&&user_id:12;;email:maria.lopez@example.com;;name:Maria Lopez", + "invitees_concatenated": "user_id:18;;email:carlos.silva@example.com;;name:Carlos Silva", + "assignees": { + "0": { "id": 7, "full_name": "Juan Perez", "email": "juan.perez@example.com" }, + "1": { "id": 12, "full_name": "Maria Lopez", "email": "maria.lopez@example.com" } + }, + "invitees": { + "0": { "id": 18, "full_name": "Carlos Silva", "email": "carlos.silva@example.com" } + }, + "last_updated_by": "Juan Perez", + "form_answer_id": 101, + "form_answer_code": "FA-12345", + "task_form_title": "Daily Inspection", + "task_form_question": "What issues were found?" + } +] +``` + +This endpoint retrieves a list of Tickets filtered by creation date period. + +### HTTP Request + +`GET https://www.mydatascope.com/api/external/findings/list` + +### Input Parameters + +Parameter | Type | Description +--------- | ------- | ----------- +start | String | Optional. Start date in `dd-mm-yyyy` format. Defaults to 7 days ago +end | String | Optional. End date in `dd-mm-yyyy` format. Defaults to today +status | String | Optional. Filter by status: `open`, `in_progress`, `paused`, `closed` +task_form_id | Integer | Optional. Filter by the ID of the associated form. Only returns tickets linked to that form +limit | Integer | Optional. Max number of results to return. Default: 200, max: 200 +offset | Integer | Optional. Number of results to skip (for pagination). Default: 0, max: 2000 + +The maximum allowed date range is **90 days**. Requests with a wider range will return `422 Unprocessable Entity`. + +### Pagination + +Results are paginated using `limit` and `offset`. `limit` controls how many results are returned, and `offset` controls how many to skip from the beginning. + +For example, if there are 400 tickets in the period: + +- First page: `limit=200&offset=0` → returns tickets 1–200 +- Second page: `limit=200&offset=200` → returns tickets 201–400 + +### Response Fields + +Field | Type | Description +--------- | ------- | ----------- +id | String | Firestore document ID +code | Integer | Sequential ticket number within the account +name | String | Ticket name +description | String | Ticket description +type | String | Resolved ticket type name (null if no type assigned) +status | String | Current status: `open`, `in_progress`, `paused`, `closed` +priority | String | Priority level: `low`, `medium`, `high`, `critical` +creation_date | String | Date and time the ticket was created, formatted according to account preferences (e.g. `30/01/2026 19:53`) +expiration_date | String | Date and time the ticket expires, formatted according to account preferences (null if none) +closure_date | String | Date and time the ticket was closed, formatted according to account preferences (null if not closed) +closure_message | String | Message provided when closing the ticket (null if not closed) +location_id | Integer | Database ID of the associated location (null if none) +location_name | String | Name of the associated location (null if none) +location_code | String | Code of the associated location (null if none) +asset_name | String | Name of the linked asset (null if none) +asset_identifier | String | Code/identifier of the linked asset (null if none) +creator_id | Integer | Database ID of the user who created the ticket +creator_email | String | Email of the user who created the ticket +creator_name | String | Full name of the user who created the ticket +assignees_concatenated | String | Assigned users as a `&&`-separated string, each entry formatted as `user_id:{id};;email:{email};;name:{name}` (empty string if none) +invitees_concatenated | String | Invited users as a `&&`-separated string, same format as `assignees_concatenated` (empty string if none) +assignees | Object | Assigned users as an indexed object: `{ "0": { "id": Integer, "full_name": String, "email": String }, ... }` (empty object if none) +invitees | Object | Invited users as an indexed object, same shape as `assignees` (empty object if none) +last_updated_by | String | Full name of the user who last updated the ticket (null if not available) +form_answer_id | Integer | Database ID of the linked form answer (null if none) +form_answer_code | String | Code of the linked form answer (null if none) +task_form_title | String | Title of the linked form (null if no form answer linked) +task_form_question | String | Question from the linked form answer (null if no form answer linked) + +### Return Codes + +``` +200: OK +401: Unauthorized +422: Unprocessable Entity (invalid date range or range exceeds 90 days) +``` + + + + +## Get Ticket + +```shell +curl "https://www.mydatascope.com/api/external/findings/get/Krdz3aFoWZ4ZVgpuAart" + -H "Authorization: b1cd93mfls9fdmfkadn23" +``` + +```ruby +require 'rest-client' +require 'json' + +url = 'https://www.mydatascope.com/api/external/findings/get/Krdz3aFoWZ4ZVgpuAart' +response = RestClient.get url, { +:Authorization => 'b1cd93mfls9fdmfkadn23', +} +JSON.parse(response) +``` + +> The above command returns JSON structured like this, you can check the description of each parameter below: + +```json +{ + "id": "Krdz3aFoWZ4ZVgpuAart", + "code": 1, + "name": "ejemplo", + "description": "Ejemplo", + "type": null, + "status": "closed", + "priority": "high", + "creation_date": "2026-01-30T19:53:52.528+00:00", + "expiration_date": "2026-01-23T19:53:00.000+00:00", + "closure_date": "2026-02-05T15:23:12.360+00:00", + "closure_message": "Addressed", + "location_name": "Main Office", + "creator_name": "Juan Perez", + "assignees": "Juan Perez, Maria Lopez", + "invitees": "Carlos Silva", + "last_updated_by": "Juan Perez", + "form_answer_id": 12345, + "task_form_title": "Daily Inspection", + "task_form_question": "What issues were found?" +} +``` + +This endpoint retrieves a single Ticket by its Firestore document ID. + +### HTTP Request + +`GET https://www.mydatascope.com/api/external/findings/get/:id` + +### URL Parameter + +Parameter | Type | Description +--------- | ------- | ----------- +id | String | Required. The Firestore document ID of the ticket. This can be obtained from the ticket URL in the DataScope web app (`?selected=`) + +### Response Fields + +Field | Type | Description +--------- | ------- | ----------- +id | String | Firestore document ID +code | Integer | Sequential ticket number within the account +name | String | Ticket name +description | String | Ticket description +type | String | Ticket Type ID (null if no type assigned) +status | String | Current status: `open`, `in_progress`, `paused`, `closed` +priority | String | Priority level: `low`, `medium`, `high`, `critical` +creation_date | Datetime | Date and time the ticket was created (ISO 8601) +expiration_date | Datetime | Date and time the ticket expires (ISO 8601) +closure_date | Datetime | Date and time the ticket was closed (null if not closed) +closure_message | String | Message provided when closing the ticket (null if not closed) +location_name | String | Name of the associated location (null if none) +creator_name | String | Full name of the user who created the ticket +assignees | String | Comma-separated list of assigned users' full names +invitees | String | Comma-separated list of invited users' full names (empty string if none) +last_updated_by | String | Full name of the user who last updated the ticket (null if not available) +form_answer_id | Integer | ID of the linked form answer (null if none) +task_form_title | String | Title of the linked form (null if no form answer linked) +task_form_question | String | Question from the linked form answer (null if no form answer linked) + +### Return Codes + +``` +200: OK +404: Not Found +403: Forbidden +``` + + From b695419b8ddbba6e33dfce537c412282e8995d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Garc=C3=ADa=20Gonz=C3=A1lez?= Date: Wed, 29 Jul 2026 12:51:41 -0400 Subject: [PATCH 11/25] docs(DS-3533): document the Answers V5 (Beta) endpoint + Airbyte Cloud manifest Answers V5 shipped to production but had no presence in the public API reference, so customers had no way to discover it or its custom fields without being pointed at an internal Notion page. Adds a `Get All Answers V5 (Beta)` section under `# Answers`, between `Get All Answers with metadata` and `Change Answer`, covering: - What the endpoint solves: in v1 to v4 every question becomes its own top-level key, so each form yields a different column set and a relational destination cannot model it. `answers_data_in_array` nests the questions in an `answers` array and the schema stops changing per form. - Full query parameter table, including the parameters added with this release: `sort_order` (asc/desc for `order_date`) and `since` (keyset pagination cursor). - A dedicated pagination section explaining the `since` cursor flow and why it beats `page`/`offset` on large or recurring exports. - All 32 `custom_fields`, grouped by what they affect (answer structure, form-level data, assigned task, assigned task location) rather than listed flat. - An `Airbyte Cloud connector` section documenting the three streams (`form_answers`, `answers`, `answer_metadata_comments`), their primary keys, and the five installation steps. - Notices for the two footguns worth calling out: `date_modified` and `order_date` must travel together when paging modified answers, and descending sort breaks the cursor under incremental sync. - A note that the token's user needs export permission, so customers configure that before wiring a recurring integration. Also publishes the connector manifest at `source/airbyte/datascope_source_manifest.yaml` so it is downloadable from a public URL. Customers previously had no way to obtain it. Co-Authored-By: Claude Opus 5 --- source/airbyte/datascope_source_manifest.yaml | 634 ++++++++++++++++++ source/index.html.md | 177 +++++ 2 files changed, 811 insertions(+) create mode 100644 source/airbyte/datascope_source_manifest.yaml diff --git a/source/airbyte/datascope_source_manifest.yaml b/source/airbyte/datascope_source_manifest.yaml new file mode 100644 index 00000000000..1be431eb835 --- /dev/null +++ b/source/airbyte/datascope_source_manifest.yaml @@ -0,0 +1,634 @@ +# ============================================================================= +# DataScope - Airbyte Low-Code (Declarative) Source Connector +# ============================================================================= +# Created: 2026-07-23 +# Last updated: 2026-07-28 (fix CursorPagination Jinja: last_record singular, +# last_page_size for stop_condition; +# new answers_form_identification custom_field) +# +# Actualizar `Last updated` en cada cambio funcional del manifest (nuevos +# streams, cambios de PK/cursor, custom_fields, ajustes de extractor). +# Los cambios puramente cosméticos (comentarios, whitespace) no cuentan. +# La fecha permite a quien replica el manifest saber si tiene la versión +# actual comparándola con la última publicada por DataScope. +# ============================================================================= +# El `base_url` default apunta a producción (https://www.mydatascope.com). +# +# Cómo usarlo: +# 1. En Airbyte Cloud: Settings -> Sources -> "Build a connector". +# 2. Menú "..." -> "Import YAML" y selecciona este archivo. +# 3. En "Testing values" (o al configurar la source): ingresa `api_token` +# (el token de tu usuario de DataScope) y `start_date` en ISO 8601. +# 4. Publica el conector y crea la conexión con Sync mode = "Incremental | Dedup". +# +# Si Airbyte Cloud rechaza el import con un error genérico, probablemente sea +# la versión declarada en `version:`. Comparar con la versión que muestra el +# Connector Builder en la esquina del proyecto y ajustar (o comentar la línea +# para usar el default del deployment). +# ============================================================================= + +version: "5.10.2" + +type: DeclarativeSource + +check: + type: CheckStream + stream_names: + - form_answers + - answers + - answer_metadata_comments + +definitions: + # ---- Autenticación: Authorization: Bearer ---------------------- + authenticator: + type: BearerAuthenticator + api_token: "{{ config['api_token'] }}" + + # ---- Requester compartido -------------------------------------------------- + requester: + type: HttpRequester + url_base: "{{ config['base_url'] }}" + path: "/api/external/v5/answers" + http_method: GET + authenticator: + $ref: "#/definitions/authenticator" + request_parameters: + # Trae por fecha de modificación (nuevos + editados). + date_modified: "true" + # Ordena por form_answers.updated_at ASC. + # + # NO cambiar a DESC (via `sort_order: "desc"`) mientras `incremental_sync` + # esté activo. El DatetimeBasedCursor de Airbyte avanza el cursor state al + # MAX(updated_at) visto por sync; con DESC el primer record ya es el + # máximo, así que todo el resto queda "detrás del cursor" y se salta + # permanentemente en el siguiente sync. ASC es la única dirección + # compatible con incremental. + # + # Contrato de consistencia con ASC: `updated_at` solo avanza hacia + # adelante, así que una fila editada durante un sync en curso puede + # reaparecer en una página posterior con sus valores nuevos, o quedar + # para el sync siguiente si su nuevo `updated_at` supera la ventana. + # Airbyte deduplica por primary key, así que en el warehouse converge + # al último estado. No hay pérdida de datos. + order_date: "true" + version: "v5" + # Filtro opcional por form(s). Cuando el cliente deja el campo + # `form_id` vacío en la config de Airbyte, se manda como string vacía + # y el backend lo interpreta como "sin filtro" (split(',') sobre "" da + # []). Cuando el cliente pone "123" o "123,456,789", el endpoint hace + # `WHERE form_id IN (...)`. + form_id: "{{ config.get('form_id') or '' }}" + # NOTA: `limit` NO va acá: lo inyecta el paginator (page_size_option → limit=200). + # Duplicarlo causa "Request body collision, duplicate keys detected at key path: limit". + # + # ─── custom_fields activos (la lista de abajo, en orden) ────────────── + # STRUCTURAL: pilares del schema estable + PK del stream `answers`: + # answers_data_in_array → anida `answers[]` (schema estable) + # answers_extra_data → meta por answer (question_id, real_question_id, subform_index, metadata_id, question_type, name) + # answers_row_key → discriminador PK type-aware + # answers_activity_order → period index para activity_period_time + # answers_form_answer_updated_at → cursor incremental heredado del parent + # answers_activity_data → start/end/duration para activity_period_time (nombres fijos, schema-safe) + # answers_metadata_comments_array → fuente del stream `answer_metadata_comments` + # answers_latitude_longitude → geo por answer + # answers_form_identification → repite form_name y form_code dentro de cada answer del stream `answers` (evita el JOIN warehouse-side para consumers que quieren contexto de form al costado de cada fila) + # FORM-LEVEL: + # form_update_variations → updated_date, updated_at_unix + # form_finished → boolean finished + # code_as_form_code → form_code (además del `code` estándar) + # form_answer_id_as_id → id == form_answer_id (PK simple del stream `form_answers`) + # TASKASSIGN CONTEXT: + # assign_base_data → assign_id, location_name, description, code + # assign_location_city → ciudad del assign + # + # ─── OPCIONALES (no van en la config baseline) ─────────────────────── + # No están activos por default porque en la mayoría de las + # configuraciones iniciales no aportan al modelo de datos que el cliente + # arma en su warehouse (agregarlos ensancha el schema sin beneficio + # inmediato). Se activan cuando el caso de uso lo pide, son campos + # reales, con consumidores reales: + # answers_selected_metadata → list_object metadata del alternative (name, description, code, attribute1/2 + location) + # task_description → descripción del TaskAssign asociado (requiere assign_base_data) + # task_gap, task_group_id, task_mandatory, + # task_late_response_allowed, task_mobile_user_id, task_start_time + # → atributos extra del TaskAssign + # assign_location_company_email, _company_code, _company_name, + # assign_location_country, _email, _latitude, _longitude, _region + # → metadata de location extendida + # + # ─── NO agregar (deliberadamente excluidos) ────────────────────────── + # answers_as_v3 → layer de retrocompat que reformatea a shape v3. + # Contradice el goal del rebuild (schema v5 puro). + # answers_comments → expone comments como columnas flat prefijadas + # (comment, comment_1, comment_type_1, …). + # Es el anti-pattern polimórfico que el + # stream `answer_metadata_comments` reemplaza. + # MUTUALLY EXCLUSIVE con + # `answers_metadata_comments_array`. + custom_fields: "answers_data_in_array,answers_extra_data,answers_form_answer_updated_at,answers_activity_order,answers_row_key,answers_activity_data,answers_metadata_comments_array,answers_latitude_longitude,answers_form_identification,form_update_variations,form_finished,code_as_form_code,form_answer_id_as_id,assign_base_data,assign_location_city" + + # ---- Paginación: keyset (seek) sobre (updated_at, form_answer_id) --------- + # Reemplaza el patrón OFFSET/LIMIT anterior. Motivos: + # 1. Correctness: si una fila se edita entre la página N y N+1 y se mueve + # dentro del sort ASC, un OFFSET N+1 podría re-emitirla (retrabajo, no + # pérdida). Keyset evita esa clase entera de escenario porque el + # "cursor" es una tupla concreta, no una posición. + # 2. Performance: OFFSET N escanea N filas antes de aplicar LIMIT, así + # que backfills largos crecen lineal en N. Keyset seek arranca en el + # punto exacto vía el índice compuesto, con costo constante por página. + # + # El backend acepta `since=|`. En la primera + # página el token no se envía (Airbyte no lo tiene aún) y el endpoint + # cae al path clásico `updated_at BETWEEN start AND end LIMIT`; a partir + # de la segunda página, el cursor extraído del último record navega + # `(updated_at, id) > (parsed_ts, parsed_id)`. `stop_condition` corta + # cuando la página devuelve menos de `page_size` filas. + # + # Dos paginators porque el campo del cursor difiere por stream: + # - `paginator_form_answers`: el record IS un form_answer → `updated_at` + # y `form_answer_id` viven en la raíz. + # - `paginator_child`: los records son answers o metadata_comments + # aplanados; el par vive como `form_answer_updated_at` y + # `form_answer_id`. + paginator_form_answers: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: "limit" + inject_into: "request_parameter" + page_token_option: + type: RequestOption + field_name: "since" + inject_into: "request_parameter" + pagination_strategy: + type: CursorPagination + page_size: 200 + # `last_record` (singular) es el único record accesor que expone esta + # versión del low-code CDK. Usar `last_records[-1]` genera + # "Jinja macro has undeclared variables: {'last_records'}". El + # `stop_condition` usa `last_page_size` (numérico) por el mismo motivo: + # `last_records | length` referencia la variable plural que no existe. + cursor_value: "{{ last_record['updated_at'] }}|{{ last_record['form_answer_id'] }}" + stop_condition: "{{ last_page_size < 200 }}" + + paginator_child: + type: DefaultPaginator + page_size_option: + type: RequestOption + field_name: "limit" + inject_into: "request_parameter" + page_token_option: + type: RequestOption + field_name: "since" + inject_into: "request_parameter" + pagination_strategy: + type: CursorPagination + page_size: 200 + cursor_value: "{{ last_record['form_answer_updated_at'] }}|{{ last_record['form_answer_id'] }}" + stop_condition: "{{ last_page_size < 200 }}" + + # ---- Selector para el stream `answers`: extrae cada form_answer del array raíz + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + + # ---- Selector para el stream `answers` (hijo): aplana el array `answers` + # anidado dentro de cada form_answer. + # + # Path shape sigue las mismas tres constraints empíricas del stream + # `answer_metadata_comments` (ver el bloque de ese stream más abajo): + # - `**` en position 0: obligatorio para atravesar el list-root response + # - `*` literal en otro nivel: triggerea el modo wildcard en Airbyte + # (equality-check `"*" in path`), evita que caiga a `dpath.get()` + # - Trailing `*`: itera el array `answers` a items individuales + record_selector_answers: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: ["**", "answers", "*"] + + # ---- Retriever para `answers` (headers de form_answer) -------------------- + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/requester" + record_selector: + $ref: "#/definitions/record_selector" + paginator: + $ref: "#/definitions/paginator_form_answers" + + # ---- Retriever para `answers` (question-value pairs aplanados) ------------ + retriever_answers: + type: SimpleRetriever + requester: + $ref: "#/definitions/requester" + record_selector: + $ref: "#/definitions/record_selector_answers" + paginator: + $ref: "#/definitions/paginator_child" + + # ---- Selector para el stream `answer_metadata_comments`: extrae los + # comentarios (text + image de multiphoto) de las preguntas tipo + # `select_option_metadata_comments`. Cada answer_item de ese tipo lleva un + # array anidado `metadata_comments[]` cuando el backend tiene activo el + # custom_field `answers_metadata_comments_array`. + # + # Path shape derivada empíricamente. Las tres constraints son obligatorias: + # - `**` en position 0: OBLIGATORIO cuando el body root es un array. + # `*` en position 0 no itera el list root (silent 0-record failure). + # - `*` literal en algún otro nivel: obligatorio para que Airbyte detecte + # wildcards y use `dpath.values()` en vez de `dpath.get()` (equality + # check `"*" in path_list`, y `**` solo no cuenta). + # - Trailing `*`: obligatorio cuando el leaf es un array container. + # Sin él dpath devuelve list-of-arrays y Airbyte tropieza intentando + # `dict.update([{N-key dict}, ...])`. + record_selector_metadata_comments: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: ["**", "answers", "*", "metadata_comments", "*"] + + # ---- Retriever para `answer_metadata_comments` ---------------------------- + retriever_metadata_comments: + type: SimpleRetriever + requester: + $ref: "#/definitions/requester" + record_selector: + $ref: "#/definitions/record_selector_metadata_comments" + paginator: + $ref: "#/definitions/paginator_child" + + # ---- Incremental por updated_at (para el stream `answers`) --------------- + incremental_cursor: + type: DatetimeBasedCursor + cursor_field: "updated_at" + # Formato principal ISO 8601 UTC compacto. Los fallbacks de abajo aceptan + # variaciones con/sin milisegundos y con/sin offset explícito. + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + cursor_datetime_formats: + - "%Y-%m-%dT%H:%M:%SZ" + - "%Y-%m-%dT%H:%M:%S%z" + - "%Y-%m-%dT%H:%M:%S.%fZ" + - "%Y-%m-%dT%H:%M:%S.%f%z" + start_datetime: + type: MinMaxDatetime + datetime: "{{ config['start_date'] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + # El endpoint acota la ventana a 90 días; usamos pasos de 30 días. + step: "P30D" + cursor_granularity: "P1D" + # Re-consulta 1 día para no perder registros; modo Dedup en destino evita duplicados. + lookback_window: "P1D" + start_time_option: + type: RequestOption + field_name: "start" + inject_into: "request_parameter" + end_time_option: + type: RequestOption + field_name: "end" + inject_into: "request_parameter" + + # ---- Incremental por form_answer_updated_at (para el stream `answers`) + # Idéntico al cursor del padre salvo por `cursor_field`: los answer records + # individuales no tienen `updated_at` propio, pero sí `form_answer_updated_at` + # (inyectado por el backend cuando `answers_form_answer_updated_at` está en + # custom_fields). + incremental_cursor_answers: + type: DatetimeBasedCursor + cursor_field: "form_answer_updated_at" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + cursor_datetime_formats: + - "%Y-%m-%dT%H:%M:%SZ" + - "%Y-%m-%dT%H:%M:%S%z" + - "%Y-%m-%dT%H:%M:%S.%fZ" + - "%Y-%m-%dT%H:%M:%S.%f%z" + start_datetime: + type: MinMaxDatetime + datetime: "{{ config['start_date'] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + step: "P30D" + cursor_granularity: "P1D" + lookback_window: "P1D" + start_time_option: + type: RequestOption + field_name: "start" + inject_into: "request_parameter" + end_time_option: + type: RequestOption + field_name: "end" + inject_into: "request_parameter" + +streams: + # --------------------------------------------------------------------------- + # Stream 1: `form_answers`: headers de cada envío del formulario. + # Cada fila es un form_answer completo. El array `answers[]` queda anidado + # para quienes prefieran usar UNNEST en BigQuery directamente, sin joinear + # contra el stream `answers` aplanado. + # --------------------------------------------------------------------------- + - type: DeclarativeStream + name: form_answers + primary_key: "form_answer_id" + retriever: + $ref: "#/definitions/retriever" + incremental_sync: + $ref: "#/definitions/incremental_cursor" + schema_loader: + type: InlineSchemaLoader + schema: + $schema: "http://json-schema.org/draft-07/schema#" + type: object + additionalProperties: true + properties: + id: + type: ["null", "integer"] + form_answer_id: + type: ["null", "integer"] + form_id: + type: ["null", "integer"] + form_name: + type: ["null", "string"] + form_state: + type: ["null", "string"] + code: + type: ["null", "string"] + form_code: + type: ["null", "string"] + user_name: + type: ["null", "string"] + user_identifier: + type: ["null", "string"] + finished: + type: ["null", "boolean"] + deleted: + type: ["null", "boolean"] + latitude: + type: ["null", "string", "number"] + longitude: + type: ["null", "string", "number"] + created_at: + type: ["null", "string"] + format: date-time + updated_at: + type: ["null", "string"] + format: date-time + updated_at_unix: + type: ["null", "integer"] + assign_id: + type: ["null", "string", "integer"] + assign_internal_id: + type: ["null", "integer"] + assign_location_name: + type: ["null", "string"] + assign_location_code: + type: ["null", "string"] + assign_location_city: + type: ["null", "string"] + answers: + type: ["null", "array"] + items: + type: object + additionalProperties: true + + # --------------------------------------------------------------------------- + # Stream 2: `answers`: cada question-value pair como fila individual + # Aplana el array `answers[]` de cada form_answer. `form_answer_id` es FK al + # stream `form_answers`. En BigQuery queda como una tabla tabulada y joinable + # (una fila por respuesta). + # + # KNOWN LIMITATION: orphan rows on deletion (activity periods, multi-select + # unchecked, subform row removed, etc.). El API filtra `expired=true` y no + # emite tombstone, así que la fila removida se queda en el warehouse. El + # `form_answer_updated_at` de la fila queda "congelado" en la versión previa + # a la edición → downstream filtra por generation con: + # + # SELECT * + # FROM `dataset.answers` a + # WHERE a.form_answer_updated_at = ( + # SELECT MAX(form_answer_updated_at) + # FROM `dataset.answers` + # WHERE form_answer_id = a.form_answer_id + # AND real_question_id = a.real_question_id + # AND COALESCE(subform_index, -1) = COALESCE(a.subform_index, -1) + # ) + # + # Partición por `(form_answer_id, real_question_id, subform_index)`, no + # solo por `form_answer_id`, para no filtrar filas de OTRAS preguntas del + # mismo form_answer que legítimamente tienen timestamps distintos. + # --------------------------------------------------------------------------- + - type: DeclarativeStream + name: answers + # PK compuesta type-safe: cubre single-value edits, multi-value adds, + # subforms, activity_period_time, y sub-preguntas de repeatable groups. + # - `real_question_id`: identidad estable del template question. + # Necesario para distinguir sub-preguntas de un mismo repeatable + # group: `question_id` apunta al grupo padre, `real_question_id` + # apunta a la sub-question específica. + # - `subform_index`: nº de repetición dentro de un repeatable group. + # - `answer_row_key`: discriminador polimórfico según tipo, calculado + # por el backend y poblado cuando `answers_row_key` está en + # custom_fields. + # * Single-value (text/number/date/photo/signature/`select_metadata`): + # `null`. La identidad no depende de `metadata_id`, así el edit + # de una selección single-choice sigue el mismo tuple PK. + # * Multi-value metadata (checklist/checkbox/etc.): `"m"`. + # * `select_activity_period_time`: `"m-p"`. + # * `attachment`/`multi_photo`: `"f"` (parent label + # stripped de `question_name`, dejando solo el índice). + primary_key: + - form_answer_id + - real_question_id + - subform_index + - answer_row_key + retriever: + $ref: "#/definitions/retriever_answers" + incremental_sync: + $ref: "#/definitions/incremental_cursor_answers" + schema_loader: + type: InlineSchemaLoader + schema: + $schema: "http://json-schema.org/draft-07/schema#" + type: object + additionalProperties: true + properties: + form_answer_id: + type: ["null", "integer"] + form_id: + type: ["null", "integer"] + form_code: + type: ["null", "string"] + # Emitted alongside form_code inside each nested answer when + # `answers_form_identification` is active. Saves a warehouse-side + # JOIN to `form_answers` for consumers that want form context + # co-located with each answer row (dashboards, per-form + # analytics tables). + form_name: + type: ["null", "string"] + form_state: + type: ["null", "string"] + latitude: + type: ["null", "number"] + longitude: + type: ["null", "number"] + question_id: + type: ["null", "integer"] + # Stable id de la sub-pregunta en el template del form. Difiere de + # `question_id` en sub-preguntas de un `Group of Repeatable Fields` + # (donde `question_id` apunta al grupo padre y `real_question_id` a + # cada sub-pregunta individual). Load-bearing en la PK. + real_question_id: + type: ["null", "integer"] + question_name: + type: ["null", "string"] + question_type: + type: ["null", "string"] + question_value: + type: ["null", "string"] + name: + type: ["null", "string"] + metadata_id: + type: ["null", "integer"] + metadata_type: + type: ["null", "string"] + subform_index: + type: ["null", "integer"] + # Server-side period index para select_activity_period_time. Poblado + # por el backend cuando `answers_activity_order` está en custom_fields. + # Null para todos los otros question types. + activity_order: + type: ["null", "integer"] + # Discriminador polimórfico calculado por el backend (ver PK docs + # arriba). Null para single-value types, deliberadamente, así + # `select_metadata` edits mantienen PK estable aunque `metadata_id` + # cambie. + answer_row_key: + type: ["null", "string"] + # Sub-fields de select_activity_period_time. Nombres fijos, + # schema-estable. Poblado por el backend cuando `answers_activity_data` + # está en custom_fields. Null para todos los otros question types. + start_time: + type: ["null", "string"] + end_time: + type: ["null", "string"] + duration: + type: ["null", "string"] + day_start: + type: ["null", "string"] + full_duration: + type: ["null", "string"] + # Cursor field para incremental, inyectado por el backend cuando + # `answers_form_answer_updated_at` está activo en custom_fields. + # Hereda el `updated_at` del form_answer padre. + form_answer_updated_at: + type: ["null", "string"] + format: date-time + + # --------------------------------------------------------------------------- + # Stream 3: `answer_metadata_comments`: comentarios (texto + fotos) de las + # respuestas de tipo `select_option_metadata_comments`. Es la tercera capa + # del modelo: form_answer → answer → metadata_comment. + # + # Cada fila = un metadata comment (texto O una foto de multiphoto). En el + # warehouse se joinea al stream `answers` con: + # ON (form_answer_id, real_question_id, subform_index, answer_row_key) + # + # Se agrega separado del stream `answers` para evitar columnas polimórficas + # (comment, comment_1, comment_type_1, ...) que romperían la estabilidad + # del schema del stream padre. + # --------------------------------------------------------------------------- + - type: DeclarativeStream + name: answer_metadata_comments + # PK compuesta: FK al parent answer + discriminadores propios (data_type + # + data_index) para distinguir múltiples comentarios en la misma answer. + primary_key: + - form_answer_id + - real_question_id + - subform_index + - answer_row_key + - data_type + - data_index + retriever: + $ref: "#/definitions/retriever_metadata_comments" + incremental_sync: + $ref: "#/definitions/incremental_cursor_answers" + schema_loader: + type: InlineSchemaLoader + schema: + $schema: "http://json-schema.org/draft-07/schema#" + type: object + additionalProperties: true + properties: + # FK subset: matchea la PK del stream `answers`. El cliente joinea + # por estos cuatro campos para reconstituir la relación padre/hijo. + form_answer_id: + type: ["null", "integer"] + real_question_id: + type: ["null", "integer"] + subform_index: + type: ["null", "integer"] + answer_row_key: + type: ["null", "string"] + # Contexto informativo del parent (no PK, solo conveniencia). + metadata_id: + type: ["null", "integer"] + # Identidad propia del comment. + data_type: + type: ["null", "string"] + data_index: + type: ["null", "integer"] + value: + type: ["null", "string"] + # Cursor field: hereda del form_answer padre. Mismo mecanismo que + # `form_answer_updated_at` en el stream `answers`. + form_answer_updated_at: + type: ["null", "string"] + format: date-time + +# ============================================================================= +# Spec: parámetros que pide Airbyte al configurar la fuente +# ============================================================================= +spec: + type: Spec + connection_specification: + $schema: "http://json-schema.org/draft-07/schema#" + type: object + required: + - api_token + - start_date + additionalProperties: true + properties: + api_token: + type: string + title: API Token + description: >- + Token de la API de DataScope (User.token). Se envía como + "Authorization: Bearer ". + airbyte_secret: true + order: 0 + base_url: + type: string + title: Base URL + description: URL base de la instancia DataScope. El default es producción. + default: "https://www.mydatascope.com" + order: 1 + start_date: + type: string + title: Start date + description: Fecha desde la cual sincronizar (por updated_at). Formato ISO 8601 UTC. + format: date-time + examples: + - "2024-01-01T00:00:00Z" + order: 2 + form_id: + type: string + title: Form ID(s) + description: >- + Opcional. Filtra la sincronización a uno o más formularios + específicos. Ingresa un ID (ej. "123") o una lista separada por + comas (ej. "123,456,789"). Dejar vacío para sincronizar todos los + formularios de la cuenta. + examples: + - "123" + - "123,456,789" + order: 3 diff --git a/source/index.html.md b/source/index.html.md index be6fd6d4622..fb08d15edb4 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -225,6 +225,183 @@ answers | Array | array with all the question of the specific form answer. assign_location_description | String | Description of the location assigned assign_location_code" | String | Code of the location assigned +## Get All Answers V5 (Beta) + +```ruby +require 'rest-client' +require 'json' + +url = 'https://www.mydatascope.com/api/external/v5/answers' +response = RestClient.get url, { +:Authorization => 'b1cd93mfls9fdmfkadn23', + :params => { + :date_modified => true, + :order_date => true, + :custom_fields => 'answers_data_in_array,answers_extra_data' + } +} +JSON.parse(response) +``` + +```shell +curl "https://www.mydatascope.com/api/external/v5/answers?date_modified=true&order_date=true&custom_fields=answers_data_in_array,answers_extra_data" + -H "Authorization: b1cd93mfls9fdmfkadn23" +``` + +> With `answers_data_in_array` the questions are nested in an `answers` array instead of becoming top-level keys, so the response shape stays the same across forms: + +```json +[ + { + "form_answer_id":257189, + "form_id":432, + "form_name":"Example Form", + "form_code":"2342", + "form_state":"Accepted", + "user_name":"Example User", + "user_identifier":"user@email.com", + "created_at":"2026-07-16T16:52:05.000Z", + "updated_at":"2026-07-18T09:14:22.000Z", + "latitude":-33.398803, + "longitude":-70.559834, + "answers":[ + { + "question_value":"Example value", + "question_name":"Example question", + "question_type":"text", + "question_id":1180, + "real_question_id":1180, + "subform_index":null, + "metadata_type":null, + "metadata_id":null + }, + { + "question_value":"Alternative 1", + "question_name":"Example checklist", + "question_type":"select_check_metadata", + "question_id":1181, + "real_question_id":1181, + "subform_index":null, + "metadata_type":"list_objects", + "metadata_id":90412 + } + ] + } +] +``` + +Answers V5 is a single endpoint that can reproduce the response shape of every previous version (v1, v2, v3, v4) and adds opt-in fields on top. Instead of a new endpoint per feature, you pick the version you want as a baseline through `version` and switch extra data on through `custom_fields`. + +The most requested use case is the `answers_data_in_array` shape shown above. In v1 to v4 each question becomes its own top-level key, so every form produces a different set of columns and a relational destination (BigQuery, Snowflake, Postgres) cannot model it cleanly. With `answers_data_in_array` the questions move into a nested `answers` array and the response schema stops changing per form. + + + + + +### HTTP Request + +`GET https://www.mydatascope.com/api/external/v5/answers` + +### Query Parameters + +Parameter | Type | Default | Description +--------- | ---- | ------- | ----------- +version | String | v5 | Reproduce the response shape of a previous version. One of `v1`, `v2`, `v3`, `v4`, `v5`. +custom_fields | String | blank | Comma separated list of extra data to include. See the table below. +form_id | Integer or String | blank | One form ID, or several comma separated. This ID is in the URL when you edit a form, eg. https://app.mydatascope.com/task_forms/XXXX/edit +user_id | Integer | blank | If set, only answers from that user +location_id | Integer | blank | If set, only answers from that location +days_limit | Integer | 7 | Days between start and end when you do not send them (max range 90 days) +start | String | last `days_limit` days | Start of the date range, ISO 8601 (eg. `2026-07-01T00:00:00Z`) +end | String | date of the last answer | End of the date range, ISO 8601. Max range 90 days +date_modified | Boolean | false | Filter by modification date (`updated_at`) instead of creation date. Use it to pull edits, not only new submissions +order_date | Boolean | false | Sort by `updated_at` instead of the default question order. Required whenever you page through modified answers +sort_order | String | asc | Direction for `order_date`. `asc` or `desc`. Keep `asc` for any incremental integration +limit | Integer | 200 | Records per page. Default and max are 200 +page | Integer | 1 | Page number. With a limit of 200, page 2 returns the next 200 records +offset | Integer | 0 | Shifts the start of the pagination +since | String | blank | Keyset pagination cursor, built from the `updated_at` and `form_answer_id` of the last record you read. More efficient than `page` or `offset` on large exports. See "Pagination with since" below + + + +### Pagination with since + +`page` and `offset` work as in previous versions. For large or recurring exports prefer `since`, which pages from the last record you already read instead of counting rows from the beginning: + +1. Request the first page normally, with `date_modified=true` and `order_date=true`. +2. Take `updated_at` and `form_answer_id` from the last record of the response. +3. Send them back as `since=|` to get the next page. +4. Repeat until a page returns fewer records than `limit`. + +A malformed cursor returns `400` with `{"error": "invalid_since_cursor"}`. When `since` is present the response is always sorted ascending, regardless of `sort_order`. + +### Custom Fields + +`custom_fields` unlocks extra data. Send the names comma separated, for example `custom_fields=answers_data_in_array,answers_extra_data,answers_selected_metadata`. Unknown names are ignored silently. + +Custom Field | Description +------------ | ----------- +answers_data_in_array | Nest the questions in an `answers` array instead of top-level keys. This is what keeps the schema stable across forms (already in v1) +answers_extra_data | Per answer metadata: `question_id`, `real_question_id`, `subform_index`, `question_type`, `metadata_type`, `metadata_id`, `name` +answers_latitude_longitude | Latitude and longitude of each answer (already in v2 and v4) +answers_selected_metadata | Name, description, code and attributes of the list object or location selected in an answer +answers_activity_data | `start_time`, `end_time`, `duration`, `day_start` and `full_duration` for Activity List answers +answers_activity_order | Period index for Activity List answers. Distinguishes several periods that selected the same alternative +answers_row_key | Stable per row discriminator. Combined with `form_answer_id`, `real_question_id` and `subform_index` it gives each answer row a primary key that survives edits +answers_form_answer_updated_at | `updated_at` of the parent form answer repeated inside each answer. Useful as an incremental cursor when you consume the answers as their own table +answers_metadata_comments_array | Checklist comments as a nested `metadata_comments` array on each answer, instead of flat prefixed columns +answers_form_identification | `form_name` and `form_code` repeated inside each answer, so you do not need to join back to the form answer +answers_comments | Checklist comments as flat prefixed columns (`comment`, `comment_1`, ...). Already in versions above 2. Do not combine with `answers_metadata_comments_array` +answers_as_v3 | Reproduce the special v3 answer format +code_as_form_code | Include the answer code as `form_code` (already in versions above 2) +form_answer_id_as_id | Include the form answer ID as `id` (already in v3) +form_finished | Include whether the form synchronized completely (already in v3) +form_update_variations | Include `updated_date` and `updated_at_unix` +assign_base_data | Basic data of the assigned Task: internal ID, custom ID, name, description, code. Required by the `task_*` and `assign_location_*` fields below +task_description | Description of the assigned Task +task_mandatory | Whether the assigned Task is mandatory +task_late_response_allowed | Whether the assigned Task accepts answers after the deadline +task_group_id | Group ID of the assigned Task +task_mobile_user_id | User ID of the assigned Task +task_start_time | Start datetime of the assigned Task +task_gap | Hour window to complete the assigned Task +assign_location_city | City of the location of the assigned Task (already in v3) +assign_location_region | Region of the location of the assigned Task +assign_location_country | Country of the location of the assigned Task +assign_location_email | Email of the location of the assigned Task +assign_location_latitude | Latitude of the location of the assigned Task +assign_location_longitude | Longitude of the location of the assigned Task +assign_location_company_email | Company email of the location. Only for Locations +assign_location_company_name | Company name of the location. Only for Locations +assign_location_company_code | Company code of the location. Only for Locations + +### Airbyte Cloud connector + +If your destination is a data warehouse, you do not need to write the pagination and incremental logic yourself. DataScope publishes a ready to use low-code connector manifest for Airbyte: + +- [Download the manifest (YAML)](https://raw.githubusercontent.com/DScope/docs/master/source/airbyte/datascope_source_manifest.yaml) +- [Browse it on GitHub](https://github.com/DScope/docs/blob/master/source/airbyte/datascope_source_manifest.yaml) + +It defines three related streams that you can join in your warehouse: + +Stream | One row per | Primary key +------ | ----------- | ----------- +form_answers | Form answer (one submission) | `form_answer_id` +answers | Answer (one question and its value) | `form_answer_id`, `real_question_id`, `subform_index`, `answer_row_key` +answer_metadata_comments | Checklist comment (text or photo) | the four above plus `data_type` and `data_index` + +To install it: in Airbyte Cloud go to Settings, Sources, "Build a connector", then use the "..." menu and "Import YAML". Configure your API token and a start date, optionally restrict it to specific forms with `form_id`, publish the connector and create the connection with Sync mode "Incremental | Dedup". + + + ## Change Answer ```ruby From e787c446fba3787d2047f7ca8cdf721f6620cd19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Garc=C3=ADa=20Gonz=C3=A1lez?= Date: Wed, 29 Jul 2026 12:59:55 -0400 Subject: [PATCH 12/25] docs(DS-3533): drop the redundant browse link and point the manifest URL at main Two fixes to the Airbyte manifest link: 1. The URL said `master`. This PR lands the file on `main` (the branch that deploys the site), so the `master` URL would have 404'd the moment the docs went live. Now `main`. 2. Removed the second "Browse it on GitHub" link. Customers download the manifest and import it into Airbyte; they do not need a blob view of it. One link instead of two URLs to keep in sync. Co-Authored-By: Claude Opus 5 --- source/index.html.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/index.html.md b/source/index.html.md index fb08d15edb4..fc20d272111 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -385,8 +385,7 @@ assign_location_company_code | Company code of the location. Only for Locations If your destination is a data warehouse, you do not need to write the pagination and incremental logic yourself. DataScope publishes a ready to use low-code connector manifest for Airbyte: -- [Download the manifest (YAML)](https://raw.githubusercontent.com/DScope/docs/master/source/airbyte/datascope_source_manifest.yaml) -- [Browse it on GitHub](https://github.com/DScope/docs/blob/master/source/airbyte/datascope_source_manifest.yaml) +[Download the manifest (YAML)](https://raw.githubusercontent.com/DScope/docs/main/source/airbyte/datascope_source_manifest.yaml) It defines three related streams that you can join in your warehouse: From e3cfdbad7bc58152f55b9c9d434c7f16aac36eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Garc=C3=ADa=20Gonz=C3=A1lez?= Date: Wed, 29 Jul 2026 13:58:24 -0400 Subject: [PATCH 13/25] docs(DS-3533): document what is safe to customize in the Airbyte manifest The manifest reads as a black box: customers either use it verbatim or edit it blind. Both are avoidable. Adds a `Customizing the manifest` subsection that says plainly it is editable YAML, then splits the surface into what is cosmetic and what is load-bearing. Safe to change, with the reasoning: stream names (they are just table names in the destination), `page_size` (200 is the endpoint ceiling so it only goes down), optional custom_fields (plus the reminder to add them to the stream schema), and the two config fields. Change with care, each paired with the actual failure mode rather than a generic warning: sort direction (the cursor jumps to the newest record and never comes back), `primary_key` (collapses distinct rows, or duplicates on every edit), `cursor_field` (stalls sync state), extractor `field_path` (returns zero records with no error, indistinguishable from an empty account), the structural custom_fields (they feed the keys and cursors), and adding `limit` to request_parameters (collides with the paginator). Two notices: rename streams before the first sync, because Airbyte treats a renamed stream as a new one and leaves the old table behind; and when a modified manifest misbehaves, re-import the published copy and reapply changes incrementally. Replaces the earlier single notice about descending sort, which is now one row of the "change with care" table instead of the only warning. Co-Authored-By: Claude Opus 5 --- source/index.html.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/source/index.html.md b/source/index.html.md index fc20d272111..f1e40fb1f3f 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -397,8 +397,36 @@ answer_metadata_comments | Checklist comment (text or photo) | the four above pl To install it: in Airbyte Cloud go to Settings, Sources, "Build a connector", then use the "..." menu and "Import YAML". Configure your API token and a start date, optionally restrict it to specific forms with `form_id`, publish the connector and create the connection with Sync mode "Incremental | Dedup". +### Customizing the manifest + +The manifest is a starting point, not a black box. It is plain YAML and you can edit it in the Connector Builder before publishing. Some parts are cosmetic, but others are load-bearing: the primary keys, the cursor fields, the extractor paths and a handful of `custom_fields` are what keep the incremental sync and the deduplication correct. Changing those without knowing what they do tends to produce silent problems rather than errors, usually duplicated rows, missing rows, or a stream that returns nothing at all. + +**Safe to change** + +What | Notes +---- | ----- +Stream names | `form_answers`, `answers` and `answer_metadata_comments` become table names in your destination. Rename them to match your own conventions +`page_size` | 200 is the endpoint maximum, so you can only lower it. Lower values mean more requests for the same data +Optional `custom_fields` | Add any field from the Custom Fields table above. When you add one, add it to that stream's schema too, so the destination types the column instead of guessing +`base_url` and `form_id` | Both are configuration fields, meant to be set per source + +**Change with care** + +What | What breaks +---- | ----------- +`order_date`, or the sort direction | Incremental sync depends on ascending `updated_at`. Descending puts the newest record on the first page, the cursor jumps to it, and everything behind it is never synced again +`primary_key` on any stream | These tuples are what make deduplication correct across edits. Shortening one collapses rows that are actually distinct; adding a mutable field creates a new row on every edit +`cursor_field`, or the `incremental_sync` blocks | The child streams inherit the parent form answer's `updated_at`. Pointing them somewhere else stalls the sync state +Extractor `field_path` | The wildcard shape is exact. A wrong path returns zero records with no error, which looks like an empty account +The structural `custom_fields` | `answers_data_in_array`, `answers_extra_data`, `answers_row_key`, `answers_form_answer_updated_at` and `answers_metadata_comments_array` feed the primary keys and the cursors. Removing one breaks whatever depended on it +Adding `limit` to `request_parameters` | The paginator already injects it, and duplicating it fails the sync with a request collision + + + ## Change Answer From 1471a501bbaa2fa337a07507efa241f535d36b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Garc=C3=ADa=20Gonz=C3=A1lez?= Date: Wed, 29 Jul 2026 14:44:47 -0400 Subject: [PATCH 14/25] docs(DS-3533): link the Answers V5 section to its companion Notion page The Notion page is where the endpoint's change history is tracked release by release, and it covers the same material in Spanish. Readers landing on this section had no way to find it. Placed inside the Beta notice rather than as a separate line, since the two facts belong together: the endpoint is still growing, and that page is where the growth is recorded. The link text flags that the page is in Spanish, so an English reader knows what they are clicking into. The Notion page already links back here, so the pair is bidirectional. Verified the page resolves anonymously (confirmed in a private window) before linking it from a public reference. Co-Authored-By: Claude Opus 5 --- source/index.html.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/index.html.md b/source/index.html.md index f1e40fb1f3f..038c196ab24 100644 --- a/source/index.html.md +++ b/source/index.html.md @@ -295,7 +295,7 @@ Answers V5 is a single endpoint that can reproduce the response shape of every p The most requested use case is the `answers_data_in_array` shape shown above. In v1 to v4 each question becomes its own top-level key, so every form produces a different set of columns and a relational destination (BigQuery, Snowflake, Postgres) cannot model it cleanly. With `answers_data_in_array` the questions move into a nested `answers` array and the response schema stops changing per form.