I think I'm following. I've never used Canvas Data to get our information, so I'm not sure what kind of aggregating they're doing.
Using the API, you can request a list of outcome results for a given user id. You can also specify an outcome_id if you want to limit it to one outcome. Neglecting to send an outcome_id will return all results for the given user_id.
The request returns an array of outcome_result objects with this structure:
'outcome_results': [
{
'hidden': False,
'hide_points': False,
'id': 200559,
'links': {
'alignment': 'assignment_259284',
'assignment': 'assignment_259284',
'learning_outcome': '16987',
'user': '31871'
},
'mastery': True,
'percent': 0.75,
'possible': 4.0,
'score': 3.0,
'submitted_or_assessed_at': '2021-03-04T17:46:29Z'
},
...]
To match the outcome to the assignment, you need to use outcome_result['links']['alignment'], which is the assignment ID. This is course-bound, so you'll need to request it within the course context (same course ID).
For quizzes, it aggregates attempts on questions linked to that outcome and I don't know of a way to get a per question report, mainly because outcomes have calculated scores. If a student gets a question wrong on an item with Outcome 1, what score do they get? There's no way to do that on the rubric scale the Outcome is attached to. That's why I look at the assessment as a whole and compare the quiz/assignments core (raw points) with their outcome performance (mastery vs non-mastery) and explore discrepancies.