Assuming you need to pass the pipelinerunid of the failed activity within Main pipeline, you need to deign the pipeline in below way :

JSON:
{
"name": "pipeline8",
"properties": {
"activities": [
{
"name": "Execute Pipeline1",
"type": "ExecutePipeline",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
"pipeline": {
"referenceName": "pipeline7",
"type": "PipelineReference"
},
"waitOnCompletion": true
}
},
{
"name": "Execute Pipeline2",
"type": "ExecutePipeline",
"dependsOn": [
{
"activity": "Execute Pipeline1",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"pipeline": {
"referenceName": "pipeline9",
"type": "PipelineReference"
},
"waitOnCompletion": true
}
},
{
"name": "Execute Pipeline3",
"type": "ExecutePipeline",
"dependsOn": [
{
"activity": "Execute Pipeline2",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"pipeline": {
"referenceName": "pipeline10",
"type": "PipelineReference"
},
"waitOnCompletion": true
}
},
{
"name": "Execute Pipeline4",
"type": "ExecutePipeline",
"dependsOn": [
{
"activity": "Execute Pipeline2",
"dependencyConditions": [
"Succeeded"
]
}
],
"userProperties": [],
"typeProperties": {
"pipeline": {
"referenceName": "pipeline11",
"type": "PipelineReference"
},
"waitOnCompletion": true
}
},
{
"name": "Fail1",
"type": "Fail",
"dependsOn": [
{
"activity": "Execute Pipeline1",
"dependencyConditions": [
"Failed"
]
}
],
"userProperties": [],
"typeProperties": {
"message": {
"value": "@activity('Execute Pipeline1').output.pipelineRunId",
"type": "Expression"
},
"errorCode": "1"
}
},
{
"name": "Fail2",
"type": "Fail",
"dependsOn": [
{
"activity": "Execute Pipeline2",
"dependencyConditions": [
"Failed"
]
}
],
"userProperties": [],
"typeProperties": {
"message": {
"value": "@activity('Execute Pipeline2').output.pipelineRunId",
"type": "Expression"
},
"errorCode": "2"
}
},
{
"name": "Fail3",
"type": "Fail",
"dependsOn": [
{
"activity": "Execute Pipeline3",
"dependencyConditions": [
"Failed"
]
},
{
"activity": "Fail5",
"dependencyConditions": [
"Skipped"
]
}
],
"userProperties": [],
"typeProperties": {
"message": "@activity('Execute Pipeline3').output.pipelineRunId",
"errorCode": "1"
}
},
{
"name": "Fail4",
"type": "Fail",
"dependsOn": [
{
"activity": "Execute Pipeline4",
"dependencyConditions": [
"Failed"
]
},
{
"activity": "Fail5",
"dependencyConditions": [
"Skipped"
]
}
],
"userProperties": [],
"typeProperties": {
"message": "@activity('Execute Pipeline4').output.pipelineRunId",
"errorCode": "4"
}
},
{
"name": "Fail5",
"type": "Fail",
"dependsOn": [
{
"activity": "Execute Pipeline3",
"dependencyConditions": [
"Failed"
]
},
{
"activity": "Execute Pipeline4",
"dependencyConditions": [
"Failed"
]
}
],
"userProperties": [],
"typeProperties": {
"message": {
"value": "@concat(activity('Execute Pipeline3').output.pipelineRunId,';',activity('Execute Pipeline4').output.pipelineRunId)",
"type": "Expression"
},
"errorCode": "5"
}
}
],
"variables": {
"test": {
"type": "String"
},
"spt": {
"type": "Array"
},
"final": {
"type": "String"
}
},
"annotations": []
}
}
Reference blog : https://datasharkx.wordpress.com/2021/08/19/error-logging-and-the-art-of-avoiding-redundant-activities-in-azure-data-factory/
Note: the fail activities capture the pipelinerunid
Finaly to capture the ID:

@activity('Execute Pipeline1').error.message