This guide is intended to provide instructions on how to interact with and use the External DynaMo API to retrieve test data.
- Identify your region
- Retrieve test metadata
- Retrieve test data
- Retrieve test recording (force trace)
- Interpret retrieved test data
Identify your region
The base URL you use to interact with the External DynaMo API is dependant on what region your (or your client's) data resides in.
Choose your region and copy the base URL provided below. For access to the Swagger documentation, you can paste and search the URL in your web browser.
Australia (East) |
https://prd-aue-api-extdynamo.valdperformance.com/ |
United States (East) |
https://prd-use-api-extdynamo.valdperformance.com/ |
Europe (West) |
https://prd-euw-api-extdynamo.valdperformance.com/ |
If you are unsure which region-specific URL to use, please contact support@vald.com.
Retrieve test metadata
URL
/v2022q2/teams/{tenantId}/tests
This endpoint is used to obtain a testId for each test in the given parameters. You can then use the testId to retrieve subsequent test data using the Retrieve test data steps below.
Path Parameters
Path Parameter | Required | Description |
tenantId | True | ID of the Tenant from which to retrieve tests (uuid). |
Query Parameters
Query Parameter | Required | Description |
modifiedFromUtc | True |
Retrieve tests modified after the specified UTC date. Format: YYYY-MM-DDT00:00:00.000Z |
testFromUtc | True |
Retrieve tests recorded after the specified UTC date. Format: YYYY-MM-DDT00:00:00.000Z |
testToUtc | True |
Retrieve tests recorded before the specified UTC date. Format: YYYY-MM-DDT00:00:00.000Z |
athleteId | False | ID of the athlete from which to retrieve tests. |
includeRepSummaries | False | Choose to include aggregated repetition summaries (boolean - default value is false). |
includeReps | False | Choose to include individual repetition data (boolean - default value is false). |
page | False | The page number to return (default is 1). |
Description
- Set the
modifiedFromUtc
to the time you last executed a total fetch on this endpoint.- If you haven't used this endpoint yet, use a time from before you began recording tests.
- Note that
modifiedFromUtc
will filter all test results greater than or equal to the given value.
- Set the
testFromUtc
andtestToUtc
query to restrict the test results retrieved.- Note that
testFromUtc
is inclusive andtestToUtc
is exclusive.
- Note that
- Store the records retrieved from the API call - this will retrieve 50 test records at a time.
- Increment the
page
parameter until you reach the end of the data.- Observe the
page
count.
- Observe the
- Log the
modifiedFromUtc
value used for next time so that you are not retrieving the same results.
Response
Example response
{
"items": [
{
"id": "d23a4754-37bc-43dd-ac7f-395592119b49",
"athleteId": "91ebc7a2-9bb9-4264-b9ba-d2c2cb21aa95",
"teamId": "4d06ea1a-8c10-4def-bd39-99ced504a4c9",
"testCategory": "Strength",
"bodyRegion": "Shoulder",
"movement": "Adduction",
"position": "Standing",
"laterality": "LeftThenRight",
"attachments": 0,
"leftAttachment": "None",
"rightAttachment": "None",
"startTimeUTC": "2021-12-16T01:36:33Z",
"durationSeconds": 8.461,
"hardwareInfo": "DynaMo-00197;DYNO-220426-FW1R4-HW1R0",
"softwareInfo": "iOS;iPhone9,3;14.8;1.2.3;#37",
"analysisInfo": "Dynamo.Analysis;1.0.0.0;225Hz;30N;Auto ROM Detection",
"analysedDateUTC": "2021-12-16T01:37:43Z",
"asymmetries": [],
"ratios": []
}
],
"currentPage": 1,
"totalItems": 1,
"totalPages": 1
}
Retrieve test data
URL
/v2022q2/teams/{tenantId}/tests/{testId}
This endpoint is used to retrieve test data for a specific test. To use this endpoint, you must first retrieve testId data using the Retrieve test metadata steps in the section above.
Path Parameters
Path Parameter | Required | Description |
tenantId | True | ID of the Tenant from which to retrieve tests (uuid). |
testId | True | ID of the specific Test to retrieve (uuid). |
Query Parameters
None.
Description
- Set the {testId} path parameter to the test you wish to inspect closer.
- Call the API using the above URL.
- Interpret the retrieved data using the steps in the section below.
Response
DynaMo Lite | DynaMo Plus Strength Test
{
"id": "4984c8fa-636d-4745-b7eb-199c6c217d53",
"athleteId": "eec1c134-f278-4a77-9161-3cb29b1ec381",
"teamId": "8dafa805-d453-4e70-b39e-4f368ba0d73d",
"testCategory": "Strength",
"bodyRegion": "Knee",
"movement": "Flexion",
"position": "Seated",
"customPosition": "",
"laterality": "LeftThenRight",
"attachments": "LeftPalmPadRightCurvedPad",
"leftAttachment": "None",
"rightAttachment": "None",
"startTimeUTC": "2024-09-04T05:01:48.60773Z",
"durationSeconds": 17.951527,
"hardwareInfo": "DynaMoLite-00784;DYNL-221221-FW0R2-HW0R5",
"softwareInfo": "iOS;iPhone12,1;17.5.1;1.8.4;#99",
"analysisInfo": "Dynamo.Analysis;1.0.0.0;225Hz;30N;Auto ROM Detection",
"analysedDateUTC": "2024-09-04T05:02:07.928596Z",
"repetitionTypeSummaries": [
{
"id": "ae060e82-04da-4553-bdda-22a2489e22a9",
"testId": "4984c8fa-636d-4745-b7eb-199c6c217d53",
"movement": "Flexion",
"laterality": "LeftSide",
"repCount": 1,
"maxForceNewtons": 84,
"avgForceNewtons": 84,
"maxImpulseNewtonSeconds": 41.819373200000015,
"avgImpulseNewtonSeconds": 41.819373200000015,
"maxRateOfForceDevelopmentNewtonsPerSecond": 341.44718819712114,
"avgRateOfForceDevelopmentNewtonsPerSecond": 341.44718819712114,
"maxRangeOfMotionDegrees": 0,
"avgRangeOfMotionDegrees": 0,
"avgTimeToPeakForceSeconds": 0.5599440000000007,
"minTimeToPeakForceSeconds": 0.5599440000000007
},
{
"id": "ce82a845-6d3c-45c6-978b-8cee55c50b6f",
"testId": "4984c8fa-636d-4745-b7eb-199c6c217d53",
"movement": "Flexion",
"laterality": "RightSide",
"repCount": 1,
"maxForceNewtons": 73.10000000000001,
"avgForceNewtons": 73.10000000000001,
"maxImpulseNewtonSeconds": 50.591829200000035,
"avgImpulseNewtonSeconds": 50.591829200000035,
"maxRateOfForceDevelopmentNewtonsPerSecond": 285.6807419872497,
"avgRateOfForceDevelopmentNewtonsPerSecond": 285.6807419872497,
"maxRangeOfMotionDegrees": 0,
"avgRangeOfMotionDegrees": 0,
"avgTimeToPeakForceSeconds": 0.8976880000000003,
"minTimeToPeakForceSeconds": 0.8976880000000003
}
],
"repetitions": [
{
"id": "6583b4b4-5a9d-4d61-9b50-7ded211f1fe6",
"testId": "4984c8fa-636d-4745-b7eb-199c6c217d53",
"movement": "Flexion",
"laterality": "RightSide",
"repNo": 1,
"startOffsetSeconds": 1.902032,
"durationSeconds": 1.0265640000000003,
"maxForceNewtons": 73.10000000000001,
"impulseNewtonSeconds": 50.591829200000035,
"rateOfForceDevelopmentNewtonsPerSecond": 285.6807419872497,
"timeToPeakForceSeconds": 0.8976880000000003,
"rangeOfMotionDegrees": 0
},
{
"id": "a25abb23-04e7-4a76-9729-8cf7f7bcb319",
"testId": "4984c8fa-636d-4745-b7eb-199c6c217d53",
"movement": "Flexion",
"laterality": "LeftSide",
"repNo": 1,
"startOffsetSeconds": 7.279272,
"durationSeconds": 0.8176960000000006,
"maxForceNewtons": 84,
"impulseNewtonSeconds": 41.819373200000015,
"rateOfForceDevelopmentNewtonsPerSecond": 341.44718819712114,
"timeToPeakForceSeconds": 0.5599440000000007,
"rangeOfMotionDegrees": 0
}
],
"asymmetries": [
{
"movement": "Flexion",
"valuePercentage": -13
}
],
"ratios": []
}
DynaMo Lite | DynaMo Plus Range of Motion Test
{
"id": "053f8417-0671-49ae-9bbd-7fb927a036f2",
"athleteId": "548d6289-b6f5-4631-9d57-d4b2a6d565be",
"teamId": "8dafa805-d453-4e70-b39e-4f368ba0d73d",
"testCategory": "RangeofMotion",
"bodyRegion": "Knee",
"movement": "Extension",
"position": "Seated",
"customPosition": "",
"laterality": "LeftSide",
"attachments": "LeftNoneRightNone",
"leftAttachment": "None",
"rightAttachment": "None",
"startTimeUTC": "2024-07-19T04:45:03.657123Z",
"durationSeconds": 8.414372,
"hardwareInfo": "DynaMoLite-00359;DYNL-221221-FW0R2-HW0R5",
"softwareInfo": "iOS;iPhone12,1;17.5.1;1.8.1;#96",
"analysisInfo": "Dynamo.Analysis;99.9.9.0;225Hz;30N;Auto ROM Detection",
"analysedDateUTC": "2024-07-19T04:45:12.071495Z",
"repetitionTypeSummaries": [
{
"id": "662808aa-df07-4d2e-a40d-0b87f4594ccd",
"testId": "053f8417-0671-49ae-9bbd-7fb927a036f2",
"movement": "Extension",
"laterality": "LeftSide",
"repCount": 1,
"maxForceNewtons": 0,
"avgForceNewtons": 0,
"maxImpulseNewtonSeconds": 0,
"avgImpulseNewtonSeconds": 0,
"maxRateOfForceDevelopmentNewtonsPerSecond": 0,
"avgRateOfForceDevelopmentNewtonsPerSecond": 0,
"maxRangeOfMotionDegrees": -32.0392012157334,
"avgRangeOfMotionDegrees": -32.0392012157334,
"avgTimeToPeakForceSeconds": 0,
"minTimeToPeakForceSeconds": 0
}
],
"repetitions": [
{
"id": "edb59011-133a-4bb3-9b85-24eefeef9134",
"testId": "053f8417-0671-49ae-9bbd-7fb927a036f2",
"movement": "Extension",
"laterality": "LeftSide",
"repNo": 1,
"startOffsetSeconds": 2.839716,
"durationSeconds": 3.684076,
"maxForceNewtons": 0,
"impulseNewtonSeconds": 0,
"rateOfForceDevelopmentNewtonsPerSecond": 0,
"timeToPeakForceSeconds": 0,
"rangeOfMotionDegrees": -32.0392012157334
}
],
"asymmetries": [],
"ratios": []
}
DynaMo Max Strength Test
{
"id": "eaf124a3-88fd-4ccf-9b51-460ba58571d6",
"athleteId": "5ad83f7b-3fdb-4725-a952-86f38106c003",
"teamId": "8dafa805-d453-4e70-b39e-4f368ba0d73d",
"testCategory": "Strength",
"bodyRegion": "Hip",
"movement": "IsometricMidThighPull",
"position": "MidThigh",
"customPosition": "",
"laterality": "None",
"attachments": "LeftPalmPadRightCurvedPad",
"leftAttachment": "None",
"rightAttachment": "None",
"startTimeUTC": "2024-08-14T00:37:21.823469Z",
"durationSeconds": 82.083425,
"hardwareInfo": "DynaMoMax-00000;DYNM-240729-FW0R1-HW0R7",
"softwareInfo": "iOS;iPhone12,1;17.5.1;1.8.4;#99",
"analysisInfo": "Dynamo.Analysis;1.0.0.0;1200Hz;30N;Auto ROM Detection",
"analysedDateUTC": "2024-08-14T00:38:43.906894Z",
"repetitionTypeSummaries": [
{
"id": "a639767b-ba00-4e2a-bd41-0dd3b2dd0ea9",
"testId": "eaf124a3-88fd-4ccf-9b51-460ba58571d6",
"movement": "IsometricMidThighPull",
"laterality": "None",
"repCount": 1,
"maxForceNewtons": 185,
"avgForceNewtons": 185,
"maxImpulseNewtonSeconds": 170.04653750000017,
"avgImpulseNewtonSeconds": 170.04653750000017,
"maxRateOfForceDevelopmentNewtonsPerSecond": 496.0661950730271,
"avgRateOfForceDevelopmentNewtonsPerSecond": 496.0661950730271,
"maxRangeOfMotionDegrees": 0,
"avgRangeOfMotionDegrees": 0,
"avgTimeToPeakForceSeconds": 0.8121749999999999,
"minTimeToPeakForceSeconds": 0.8121749999999999,
"avgBaselineForceNewtons": 50.1943949652778,
"avgNetPeakForceNewtons": 134.8056050347222,
"avgNetForceAt100msNewtons": 4.805605034722198,
"avgNetForceAt150msNewtons": 3.3056050347221984,
"avgNetForceAt200msNewtons": 8.805605034722198,
"avgNetImpulseAt100msNewtonSeconds": 0.10635127927082688,
"avgNetImpulseAt150msNewtonSeconds": 0.24803316890624477,
"avgNetImpulseAt200msNewtonSeconds": 0.4842605585416581,
"avgTimeTo80PercentPeakForceSeconds": 0.8121749999999999,
"avgRateOfForceDevelopment150msNewtonsPerSecond": 10.004001600640258,
"avgRateOfForceDevelopment200msNewtonsPerSecond": 35.01400560224096,
"avgRateOfForceDevelopment250msNewtonsPerSecond": 32.0128051220489,
"maxBaselineForceNewtons": 50.1943949652778,
"maxNetPeakForceNewtons": 134.8056050347222,
"maxNetForceAt100msNewtons": 4.805605034722198,
"maxNetForceAt150msNewtons": 3.3056050347221984,
"maxNetForceAt200msNewtons": 8.805605034722198,
"maxNetImpulseAt100msNewtonSeconds": 0.10635127927082688,
"maxNetImpulseAt150msNewtonSeconds": 0.24803316890624477,
"maxNetImpulseAt200msNewtonSeconds": 0.4842605585416581,
"maxRateOfForceDevelopment150msNewtonsPerSecond": 10.004001600640258,
"maxRateOfForceDevelopment200msNewtonsPerSecond": 35.01400560224096,
"maxRateOfForceDevelopment250msNewtonsPerSecond": 32.0128051220489,
"minTimeTo80PercentPeakForceSeconds": 0.8121749999999999
}
],
"repetitions": [
{
"id": "42feb799-b513-4ab7-81cf-4394f08933e0",
"testId": "eaf124a3-88fd-4ccf-9b51-460ba58571d6",
"movement": "IsometricMidThighPull",
"laterality": "None",
"repNo": 1,
"startOffsetSeconds": 5.944288,
"durationSeconds": 1.6301809999999994,
"maxForceNewtons": 185,
"impulseNewtonSeconds": 170.04653750000017,
"rateOfForceDevelopmentNewtonsPerSecond": 496.0661950730271,
"timeToPeakForceSeconds": 0.8121749999999999,
"rangeOfMotionDegrees": 0,
"baselineForceNewtons": 50.1943949652778,
"netPeakForceNewtons": 134.8056050347222,
"netForceAt100msNewtons": 4.805605034722198,
"netForceAt150msNewtons": 3.3056050347221984,
"netForceAt200msNewtons": 8.805605034722198,
"netImpulseAt100msNewtonSeconds": 0.10635127927082688,
"netImpulseAt150msNewtonSeconds": 0.24803316890624477,
"netImpulseAt200msNewtonSeconds": 0.4842605585416581,
"timeTo80PercentPeakForceSeconds": 0.8121749999999999,
"rateOfForceDevelopment150msNewtonsPerSecond": 10.004001600640258,
"rateOfForceDevelopment200msNewtonsPerSecond": 35.01400560224096,
"rateOfForceDevelopment250msNewtonsPerSecond": 32.0128051220489
}
],
"asymmetries": [],
"ratios": []
}
Retrieve test recording (force trace)
URL
/v2022q2/teams/{tenantId}/tests/{testId}/trace
Path Parameters
Path Parameter | Required | Description |
tenantId | True | ID of the Tenant from which to retrieve tests (uuid). |
testId | True | ID of the specific test to retrieve (uuid). |
Description
After retrieving a specific testId
from the Paged Test Data Retrieval (/v2022q2/teams/{tenantId}/tests
)
- Set the
{testId}
path parameter to the test you wish to retrieve a recording from. - Call the API using
/v2022q2/teams/{tenantId}/tests/{testId}/trace
- Observe the retrieved test recording.
- Strength tests will have force data in Newtons and time in seconds returned within the
forceTrace
. - Range of Motion tests will have the IMU quaternion and time in seconds returned in the
imutrace
.
- Strength tests will have force data in Newtons and time in seconds returned within the
Response
Example response
{
"id": "a14c5f35-dfea-4d5f-808f-e1563bee4497",
"profileId": "90121cfa-2b4b-46b2-9851-570e62de7a3b",
"tenantId": "8dafa805-d453-4e70-b39e-4f368ba0d73d",
"startTimeUTC": "2024-08-14T00:23:26.422397Z",
"forceTrace": [
{
"timeSeconds": 0,
"forceNewtons": 5
},
{
"timeSeconds": 0.000833,
"forceNewtons": 3.5
},
{
"timeSeconds": 0.001666,
"forceNewtons": 4
},
{
"timeSeconds": 0.002499,
"forceNewtons": 1.5
},
{
"timeSeconds": 0.003332,
"forceNewtons": 0
},
{
"timeSeconds": 0.004165,
"forceNewtons": 0.5
},
{
"timeSeconds": 0.004998,
"forceNewtons": -3
},
{
"timeSeconds": 0.005831,
"forceNewtons": -3
},
{
"timeSeconds": 0.006664,
"forceNewtons": 0.5
},
{
"timeSeconds": 0.007497,
"forceNewtons": 0
},
{
"timeSeconds": 0.00833,
"forceNewtons": -1.5
},
{
"timeSeconds": 0.009163,
"forceNewtons": -1
},
{
"timeSeconds": 0.009996,
"forceNewtons": -0.5
},
{
"timeSeconds": 0.010829,
"forceNewtons": 0.5
},
{
"timeSeconds": 0.011662,
"forceNewtons": 1
},
{
"timeSeconds": 0.012495,
"forceNewtons": 0.5
},
{
"timeSeconds": 0.013328,
"forceNewtons": 0
},
{
"timeSeconds": 0.014161,
"forceNewtons": -1
},
{
"timeSeconds": 0.014994,
"forceNewtons": -1
},
{
"timeSeconds": 0.015827,
"forceNewtons": 2.5
},
{
"timeSeconds": 0.01666,
"forceNewtons": 2.5
},
{
"timeSeconds": 0.017493,
"forceNewtons": 1.5
},
{
"timeSeconds": 0.018326,
"forceNewtons": 1
},
{
"timeSeconds": 0.019159,
"forceNewtons": 0
}
],
"imutrace": []
}
Interpret retrieved test data
From the example responses in the 'Retrieve test data' section above, we can use the following information to interpret the data.
Test category
"testCategory"
This should be used to determine if the test was Strength or Range of Motion (ROM).
Test name
"bodyRegion" "movement" "-" "position"
To construct the test type name, it is common practice to follow the above format.
Using one of the example responses from the 'Retrieve test data' section, the test name would be translated as 'Knee Flexion - Seated'.
It is not advisable to use "laterality", "leftAttachment", or "rightAttachment" arrays to reconstruct a test type name as this will result in data not aggregating correctly across similar test types.
Test laterality / side
"laterality"
The laterality indicates which side the test was performed on. The following laterality results are possible:
LeftSide | The test was performed only on the left side. |
RightSide | The test was performed only on the right side. |
LeftThenRight | The test was performed on the left side, then on the right side. |
RightThenLeft | The test was performed on the right side, then on the left side. |
None | The bodyRegion tested has no laterality (e.g. neck, trunk). |
Repetitions
"repetitionTypeSummaries" and "repCount"
The repetitionTypeSummaries array provides an aggregate of data across all repetitions. For bilateral tests (i.e. "laterality" of LeftThenRight or RightThenLeft), there will always be repetitionTypeSummaries returned for both the LeftSide and RightSide.
These repetitionTypeSummaries will include a repCount which gives an indication of how many reps were performed for each laterality / side.
In most cases, it is advisable to use the results from the "repetitionTypeSummaries" instead of the "repetitions" array.
Comments
0 comments
Please sign in to leave a comment.