curl --request POST \
--url https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"assets": [
{
"blobPath": "550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4"
}
],
"contextItems": [
{
"applyTo": "all",
"blobPath": "660e8400-e29b-41d4-a716-446655440111/evidence.pdf",
"contextType": "substantiation",
"kind": "file",
"mimeType": "application/pdf",
"name": "evidence.pdf"
}
],
"name": "Summer Campaign Launch",
"sidekickIds": [
"3b2f766c-14e5-4d96-bcb1-dd1c963818ca"
],
"tags": [
{
"applyTo": "all",
"key": "Campaign",
"value": "Summer"
}
]
}
'import requests
url = "https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions"
payload = {
"assets": [{ "blobPath": "550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4" }],
"contextItems": [
{
"applyTo": "all",
"blobPath": "660e8400-e29b-41d4-a716-446655440111/evidence.pdf",
"contextType": "substantiation",
"kind": "file",
"mimeType": "application/pdf",
"name": "evidence.pdf"
}
],
"name": "Summer Campaign Launch",
"sidekickIds": ["3b2f766c-14e5-4d96-bcb1-dd1c963818ca"],
"tags": [
{
"applyTo": "all",
"key": "Campaign",
"value": "Summer"
}
]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assets: [{blobPath: '550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4'}],
contextItems: [
{
applyTo: 'all',
blobPath: '660e8400-e29b-41d4-a716-446655440111/evidence.pdf',
contextType: 'substantiation',
kind: 'file',
mimeType: 'application/pdf',
name: 'evidence.pdf'
}
],
name: 'Summer Campaign Launch',
sidekickIds: ['3b2f766c-14e5-4d96-bcb1-dd1c963818ca'],
tags: [{applyTo: 'all', key: 'Campaign', value: 'Summer'}]
})
};
fetch('https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'assets' => [
[
'blobPath' => '550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4'
]
],
'contextItems' => [
[
'applyTo' => 'all',
'blobPath' => '660e8400-e29b-41d4-a716-446655440111/evidence.pdf',
'contextType' => 'substantiation',
'kind' => 'file',
'mimeType' => 'application/pdf',
'name' => 'evidence.pdf'
]
],
'name' => 'Summer Campaign Launch',
'sidekickIds' => [
'3b2f766c-14e5-4d96-bcb1-dd1c963818ca'
],
'tags' => [
[
'applyTo' => 'all',
'key' => 'Campaign',
'value' => 'Summer'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions"
payload := strings.NewReader("{\n \"assets\": [\n {\n \"blobPath\": \"550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4\"\n }\n ],\n \"contextItems\": [\n {\n \"applyTo\": \"all\",\n \"blobPath\": \"660e8400-e29b-41d4-a716-446655440111/evidence.pdf\",\n \"contextType\": \"substantiation\",\n \"kind\": \"file\",\n \"mimeType\": \"application/pdf\",\n \"name\": \"evidence.pdf\"\n }\n ],\n \"name\": \"Summer Campaign Launch\",\n \"sidekickIds\": [\n \"3b2f766c-14e5-4d96-bcb1-dd1c963818ca\"\n ],\n \"tags\": [\n {\n \"applyTo\": \"all\",\n \"key\": \"Campaign\",\n \"value\": \"Summer\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"assets\": [\n {\n \"blobPath\": \"550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4\"\n }\n ],\n \"contextItems\": [\n {\n \"applyTo\": \"all\",\n \"blobPath\": \"660e8400-e29b-41d4-a716-446655440111/evidence.pdf\",\n \"contextType\": \"substantiation\",\n \"kind\": \"file\",\n \"mimeType\": \"application/pdf\",\n \"name\": \"evidence.pdf\"\n }\n ],\n \"name\": \"Summer Campaign Launch\",\n \"sidekickIds\": [\n \"3b2f766c-14e5-4d96-bcb1-dd1c963818ca\"\n ],\n \"tags\": [\n {\n \"applyTo\": \"all\",\n \"key\": \"Campaign\",\n \"value\": \"Summer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assets\": [\n {\n \"blobPath\": \"550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4\"\n }\n ],\n \"contextItems\": [\n {\n \"applyTo\": \"all\",\n \"blobPath\": \"660e8400-e29b-41d4-a716-446655440111/evidence.pdf\",\n \"contextType\": \"substantiation\",\n \"kind\": \"file\",\n \"mimeType\": \"application/pdf\",\n \"name\": \"evidence.pdf\"\n }\n ],\n \"name\": \"Summer Campaign Launch\",\n \"sidekickIds\": [\n \"3b2f766c-14e5-4d96-bcb1-dd1c963818ca\"\n ],\n \"tags\": [\n {\n \"applyTo\": \"all\",\n \"key\": \"Campaign\",\n \"value\": \"Summer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"submissionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflowId": "<string>",
"ablyChannel": "<string>",
"assets": [
{
"assetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"versionGroupId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"versionNumber": 1
}
],
"skippedTags": [
{
"key": "<string>",
"value": "<string>"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Create Submission
Create a submission from one or more pre-uploaded assets.
Each asset must have been uploaded first via POST /uploads/url. Pass the returned blob_path for each asset here.
Authentication: Requires X-API-Key header with valid API key.
Raises: 400: If simulationDelaySeconds is used with a live API key 401: If API key missing or invalid 403: If a blob path fails validation 404: If a previous_submission_id is not found in the workspace 413: If an uploaded blob exceeds the per-bucket size cap 415: If the uploaded bytes don’t match the blob path’s declared type, or the declared type is not in the allowlist 422: If request validation fails
curl --request POST \
--url https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"assets": [
{
"blobPath": "550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4"
}
],
"contextItems": [
{
"applyTo": "all",
"blobPath": "660e8400-e29b-41d4-a716-446655440111/evidence.pdf",
"contextType": "substantiation",
"kind": "file",
"mimeType": "application/pdf",
"name": "evidence.pdf"
}
],
"name": "Summer Campaign Launch",
"sidekickIds": [
"3b2f766c-14e5-4d96-bcb1-dd1c963818ca"
],
"tags": [
{
"applyTo": "all",
"key": "Campaign",
"value": "Summer"
}
]
}
'import requests
url = "https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions"
payload = {
"assets": [{ "blobPath": "550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4" }],
"contextItems": [
{
"applyTo": "all",
"blobPath": "660e8400-e29b-41d4-a716-446655440111/evidence.pdf",
"contextType": "substantiation",
"kind": "file",
"mimeType": "application/pdf",
"name": "evidence.pdf"
}
],
"name": "Summer Campaign Launch",
"sidekickIds": ["3b2f766c-14e5-4d96-bcb1-dd1c963818ca"],
"tags": [
{
"applyTo": "all",
"key": "Campaign",
"value": "Summer"
}
]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assets: [{blobPath: '550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4'}],
contextItems: [
{
applyTo: 'all',
blobPath: '660e8400-e29b-41d4-a716-446655440111/evidence.pdf',
contextType: 'substantiation',
kind: 'file',
mimeType: 'application/pdf',
name: 'evidence.pdf'
}
],
name: 'Summer Campaign Launch',
sidekickIds: ['3b2f766c-14e5-4d96-bcb1-dd1c963818ca'],
tags: [{applyTo: 'all', key: 'Campaign', value: 'Summer'}]
})
};
fetch('https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'assets' => [
[
'blobPath' => '550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4'
]
],
'contextItems' => [
[
'applyTo' => 'all',
'blobPath' => '660e8400-e29b-41d4-a716-446655440111/evidence.pdf',
'contextType' => 'substantiation',
'kind' => 'file',
'mimeType' => 'application/pdf',
'name' => 'evidence.pdf'
]
],
'name' => 'Summer Campaign Launch',
'sidekickIds' => [
'3b2f766c-14e5-4d96-bcb1-dd1c963818ca'
],
'tags' => [
[
'applyTo' => 'all',
'key' => 'Campaign',
'value' => 'Summer'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions"
payload := strings.NewReader("{\n \"assets\": [\n {\n \"blobPath\": \"550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4\"\n }\n ],\n \"contextItems\": [\n {\n \"applyTo\": \"all\",\n \"blobPath\": \"660e8400-e29b-41d4-a716-446655440111/evidence.pdf\",\n \"contextType\": \"substantiation\",\n \"kind\": \"file\",\n \"mimeType\": \"application/pdf\",\n \"name\": \"evidence.pdf\"\n }\n ],\n \"name\": \"Summer Campaign Launch\",\n \"sidekickIds\": [\n \"3b2f766c-14e5-4d96-bcb1-dd1c963818ca\"\n ],\n \"tags\": [\n {\n \"applyTo\": \"all\",\n \"key\": \"Campaign\",\n \"value\": \"Summer\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"assets\": [\n {\n \"blobPath\": \"550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4\"\n }\n ],\n \"contextItems\": [\n {\n \"applyTo\": \"all\",\n \"blobPath\": \"660e8400-e29b-41d4-a716-446655440111/evidence.pdf\",\n \"contextType\": \"substantiation\",\n \"kind\": \"file\",\n \"mimeType\": \"application/pdf\",\n \"name\": \"evidence.pdf\"\n }\n ],\n \"name\": \"Summer Campaign Launch\",\n \"sidekickIds\": [\n \"3b2f766c-14e5-4d96-bcb1-dd1c963818ca\"\n ],\n \"tags\": [\n {\n \"applyTo\": \"all\",\n \"key\": \"Campaign\",\n \"value\": \"Summer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.northell.io/nhl/prod/mediamagic-verify-integrations/api/submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assets\": [\n {\n \"blobPath\": \"550e8400-e29b-41d4-a716-446655440000/campaign-video.mp4\"\n }\n ],\n \"contextItems\": [\n {\n \"applyTo\": \"all\",\n \"blobPath\": \"660e8400-e29b-41d4-a716-446655440111/evidence.pdf\",\n \"contextType\": \"substantiation\",\n \"kind\": \"file\",\n \"mimeType\": \"application/pdf\",\n \"name\": \"evidence.pdf\"\n }\n ],\n \"name\": \"Summer Campaign Launch\",\n \"sidekickIds\": [\n \"3b2f766c-14e5-4d96-bcb1-dd1c963818ca\"\n ],\n \"tags\": [\n {\n \"applyTo\": \"all\",\n \"key\": \"Campaign\",\n \"value\": \"Summer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"submissionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflowId": "<string>",
"ablyChannel": "<string>",
"assets": [
{
"assetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"versionGroupId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"versionNumber": 1
}
],
"skippedTags": [
{
"key": "<string>",
"value": "<string>"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Workspace-scoped API key. Format: sk_live_{64 hex chars}
Query Parameters
0 <= x <= 30Body
Request model for creating a submission.
Assets to include in the submission
1Show child attributes
Show child attributes
Sidekick UUIDs to run for compliance checking. At least one is required — a submission with no sidekick has nothing to check.
1Optional display name for the submission. Defaults to the first asset's filename if omitted.
120Tags to apply to assets, referenced by key/value (found-or-created).
Show child attributes
Show child attributes
Supporting files/links to attach to assets for the compliance review.
Show child attributes
Show child attributes
Optional custom metadata
Structured reference to the external work item this submission originates from. Returned on GET and echoed on the asset.processing.* webhook so an integration can correlate the completion back.
Show child attributes
Show child attributes
Response
Successful Response
Response model for submission creation.
Created submission ID
Workflow ID (job tracking ID)
Ably channel for real-time updates
Submission status
uploading, submitted, queued, processing, complete, failed, partial Created assets
Show child attributes
Show child attributes
Tags refused by value-policy governance. The submission succeeded (partial success, BR-13); only these specific tags were not applied.
Show child attributes
Show child attributes