openapi: 3.2.0
info:
title: creative Scoring API
version: '2'
servers:
- url: https://public-api.vidmob.com
security:
- sec0: []
tags:
- name: Scoring
paths:
/v1/scoring/workspace/{workspaceId}/scorecards:
get:
summary: Get Workspace Scorecards
description: This endpoint gets a list of scorecards for a given workspace. It supports several filtering options through query params.
operationId: get-workspace-scorecards
parameters:
- name: workspaceId
in: path
description: The ID of the workspace you want to query scorecards for
schema:
type: integer
format: int32
required: true
- name: scoreDetail
in: query
description: Include score details in response
schema:
type: boolean
default: false
- name: sortOrder
in: query
description: Tells the API how to sort the output
schema:
type: string
default: DESC
- name: sortBy
in: query
description: Specfies the property to sort on
schema:
type: string
- name: types
in: query
description: Scorecard type
required: true
schema:
type: string
enum:
- AD_ACCOUNT
- IN_FLIGHT
- PRE_FLIGHT
- name: channels
in: query
description: Comma separated list of channels
schema:
type: string
- name: startDate
in: query
description: Filter scorecards that have a start date greater than this date
required: true
schema:
type: string
format: date
- name: endDate
in: query
description: Filter scorecards that have an end date less than this date
required: true
schema:
type: string
format: date
- name: markets
in: query
description: Comma separated list of markets
schema:
type: string
- name: creators
in: query
description: Comma separated list of user ids that created the scorecards
schema:
type: string
- name: statuses
in: query
description: Comma separated list of scorecared statuses
schema:
type: string
- name: searchText
in: query
description: Search text
schema:
type: string
- name: brands
in: query
description: Comma separated list of brands
schema:
type: string
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"OK\",\n \"pagination\": {\n \"offset\": 0,\n \"perPage\": 1,\n \"nextOffset\": 1,\n \"totalSize\": 1\n },\n \"result\": [\n {\n \"id\": 12345,\n \"name\": \"example-scorecard-name\",\n \"batchType\": \"IN_FLIGHT\",\n \"status\": \"COMPLETE\",\n \"criteriaSetId\": 789,\n \"partnerId\": 345,\n \"platforms\": [\"TIKTOK\"],\n \"partnerAssetFolderId\": 234,\n \"reasonOutdated\": \"Critera Change\",\n \"isOutdated\": true,\n \"dateCreated\": \"2023-10-05T08:00:00Z\",\n \"lastUpdated\": \"2023-10-05T08:00:00Z\",\n \"startDate\": \"2023-09-01T00:00:00Z\",\n \"endDate\": \"2023-09-30T23:59:59Z\",\n \"score\": 88,\n \"isInternal\": false,\n \"baseReportId\": 123,\n \"totalMediaCount\" 5,\n \"markets\": [\n {\n \"isoCode\": \"usa\",\n \"name\": \"United States\"\n }\n ],\n \"brands\": [\n {\n \"id\": \"example-id\",\n \"name\": \"example brand name\",\n }\n ],\n \"person\": {\n \"id\": 123,\n \"firstName\": \"Example Name\",\n \"lastName\": \"Last Name\",\n \"email\": \"abc@example.com\"\n },\n \"platformAdAccount\": {\n \"id\": 123,\n \"platform\": \"TIKTOK\",\n \"platformAccountId\": \"example-account-id\",\n \"platformAccountName\": \"example account name\"\n },\n \"scoreDetail\": {\n \"scoreData\": {\n \"adherencePercent\": 50,\n \t\t\t\t\"passCount\": 4,\n \t\t\t\t\"failCount\": 4,\n \t\t\t\t\"applicableCount\": 8,\n \t\t\t\t\"notApplicableCount\": 2,\n \t\t\t\t\"notAvailableCount\": 1\n }\n \"channels\": [\n {\n \"channel\": \"TIKTOK\",\n \"scoreData\": {\n \"adherencePercent\": 75,\n \"passCount\": 15,\n \"failCount\": 5,\n \"applicableCount\": 20,\n \"notApplicableCount\": 0,\n \"notAvailableCount\": 0\n }\n \"criteria\": [\n {\n \"criteriaSummary\": {\n \t\t\t\t\"identifier\": \"MAX_WORDS_PER_FRAME\",\n \t\t\t\t\t\t\t\t\"parameters\": {\n \t\"maxWordsPerFrame\": 10\n \t\t\t\t}\n \t\t\t},\n \"scoreData\": {\n \"adherencePercent\": 90,\n \"passCount\": 4,\n \"failCount\": 1,\n \"applicableCount\": 5,\n \"notApplicableCount\": 0,\n \"notAvailableCount\": 0\n }\n }\n ]\n }\n ]\n }\n }\n ]\n}"
'400':
description: '400'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ERROR\",\n \"traceId\": \"example-trace-id\",\n \"error\": {\n \"identifier\": \"vidmob.scoring.badrequestexception\",\n \"type\": \"BADREQUESTEXCEPTION\",\n \"system\": \"scoring\",\n \"message\": \"Example message\"\n }\n}"
schema:
type: object
properties:
status:
type: string
example: ERROR
traceId:
type: string
example: example-trace-id
error:
type: object
properties:
identifier:
type: string
example: vidmob.scoring.badrequestexception
type:
type: string
example: BADREQUESTEXCEPTION
system:
type: string
example: scoring
message:
type: string
example: Example message
'401':
description: '401'
content:
application/json:
examples:
Result:
value: "{\n \"statusCode\": 401,\n \"message\": \"Request is Unauthorized\",\n \"error\": \"Unauthorized\"\n}"
schema:
type: object
properties:
statusCode:
type: integer
example: 401
default: 0
message:
type: string
example: Request is Unauthorized
error:
type: string
example: Unauthorized
deprecated: false
tags:
- Scoring
/v1/scoring/media/{mediaId}/scores:
get:
summary: Get Media Score
description: Provides criteria scores for media if they are available.
operationId: get-media-score
parameters:
- name: mediaId
in: path
description: ID that identifies the media
schema:
type: string
required: true
- name: channel
in: query
description: Comma separated list of platforms for which to get the media score
schema:
type: string
- name: source
in: query
description: Specifies the media source
schema:
type: string
- name: version
in: query
description: Specifies the media version
schema:
type: string
- name: consideration
in: query
description: Specifies criteria consideration (MANDATORY,OPTIONAL or both)
schema:
type: string
enum:
- MANDATORY
- OPTIONAL
default: MANDATORY,OPTIONAL
- name: format
in: query
description: Specifies the resonse format
schema:
type: string
enum:
- summary
- detail
default: summary
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"OK\",\n \"result\": {\n \"media\": {\n \"uniqueId\": \"example-media-unique-id\",\n \t\t\"id\": \"example-media-external-id\",\n \"version\": \"example-version\",\n \"name: \"example-media-name\",\n \"dateUploaded\": \"2023-09-01T00:00:00Z\",\n \"type\": \"example-media-type\"\n },\n \"summary\": {\n \"TIKTOK\": {\n \"adherencePercent\": 0.75,\n \"passCount\": 3,\n \"failCount\": 1,\n \"applicableCount\": 4,\n \"notApplicableCount\": 1,\n \"notAvailableCount\": 3\n },\n \"SNAPCHAT\": {\n \"adherencePercent\": 0.5,\n \"passCount\": 2,\n \"failCount\": 2,\n \"applicableCount\": 4,\n \"notApplicableCount\": 0,\n \"notAvailableCount\": 0\n }\n },\n \"detail\": [\n {\n \"name\": \"Motion Early (Video only)\",\n \"rule\": \"Motion is detected in the first 3 seconds of video\",\n \"channelIdentifier\": \"TIKTOK\",\n \"result\": \"PASS\",\n \"weight\": 1\n },\n {\n \"name\": \"Video Length Within Range (Video only)\",\n \"rule\": \"Video length is within 12 and 19 seconds\",\n \"channelIdentifier\": \"TIKTOK\",\n \"result\": \"FAIL\",\n \"weight\": 1\n },\n {\n \"name\": \"Brand Name or Logo Early\",\n \"rule\": \"Confirms if, based on this account’s settings, the brand name or logo is shown in the first 2 seconds.\",\n \"channelIdentifier\": \"TIKTOK\",\n \"result\": \"PASS\",\n \"weight\": 1\n },\n {\n \"name\": \"Call to Action Present\",\n \"rule\": \"Indicates if a written call to action is included.\",\n \"channelIdentifier\": \"TIKTOK\",\n \"result\": \"PASS\",\n \"weight\": 0\n },\n {\n \"name\": \"Video Length Within Range (Video only)\",\n \"rule\": \"Video length is within 12 and 19 seconds\",\n \"channelIdentifier\": \"TIKTOK\",\n \"result\": \"FAIL\",\n \"weight\": 0\n },\n {\n \"name\": \"Brand Name or Logo Early\",\n \"rule\": \"Confirms if, based on this account’s settings, the brand name or logo is shown in the first 2 seconds.\",\n \"channelIdentifier\": \"SNAPCHAT\",\n \"result\": \"FAIL\",\n \"weight\": 0\n },\n {\n \"name\": \"Call to Action Present\",\n \"rule\": \"Indicates if a written call to action is included.\",\n \"channelIdentifier\": \"SNAPCHAT\",\n \"result\": \"PASS\",\n \"weight\": 1\n },\n {\n \"name\": \"Motion Early (Video only)\",\n \"rule\": \"Motion is detected in the first 1 seconds of video\",\n \"channelIdentifier\": \"SNAPCHAT\",\n \"result\": \"PASS\",\n \"weight\": 1\n }\n ]\n }\n}"
'400':
description: '400'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ERROR\",\n \"traceId\": \"example-trace-id\",\n \"error\": {\n \"identifier\": \"vidmob.scoring.badrequestexception\",\n \"type\": \"BADREQUESTEXCEPTION\",\n \"system\": \"scoring\",\n \"message\": \"Example message\"\n }\n}"
schema:
type: object
properties:
status:
type: string
example: ERROR
traceId:
type: string
example: example-trace-id
error:
type: object
properties:
identifier:
type: string
example: vidmob.scoring.badrequestexception
type:
type: string
example: BADREQUESTEXCEPTION
system:
type: string
example: scoring
message:
type: string
example: Example message
'401':
description: '401'
content:
application/json:
examples:
Result:
value: "{\n \"statusCode\": 401,\n \"message\": \"Request is Unauthorized\",\n \"error\": \"Unauthorized\"\n}"
schema:
type: object
properties:
statusCode:
type: integer
example: 401
default: 0
message:
type: string
example: Request is Unauthorized
error:
type: string
example: Unauthorized
'404':
description: '404'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ERROR\",\n \"traceId\": \"example-trace-id\",\n \"error\": {\n \"identifier\": \"vidmob.scoring.notfoundexception\",\n \"type\": \"NOTFOUNDEXCEPTION\",\n \"system\": \"scoring\",\n \"message\": \"No API media record found for external media ID: example-media-id with source: example-source\"\n }\n}"
schema:
type: object
properties:
status:
type: string
example: ERROR
traceId:
type: string
example: example-trace-id
error:
type: object
properties:
identifier:
type: string
example: vidmob.scoring.notfoundexception
type:
type: string
example: NOTFOUNDEXCEPTION
system:
type: string
example: scoring
message:
type: string
example: 'No API media record found for external media ID: example-media-id with source: example-source'
deprecated: false
tags:
- Scoring
/v1/scoring/criteria/metadata:
post:
summary: Get Criteria Metadata
description: This endpoint provides a list of criteria across all workspaces in an organization along with the organization level criteria.
operationId: get-criteria-metadata
parameters:
- name: perPage
in: query
description: Pagination parameter to set page size
schema:
type: integer
format: int32
default: 10
- name: offset
in: query
description: Pagination parameter to specify offset from zero.
schema:
type: integer
format: int32
default: 0
requestBody:
content:
application/json:
schema:
type: object
properties:
workspaces:
type: array
description: Limit response to list of workspace IDs provided. Mutually exclusive with `globalOnly` parameter.
items:
type: integer
format: int32
channels:
type: array
description: Limit response to include criteria from list of channels provided.
items:
type: string
consideration:
type: string
description: Filter criteria by consideration. Accepted values are `MANDATORY` or `OPTIONAL`
enum:
- MANDATORY
- OPTIONAL
criteriaGroups:
type: array
description: Filter criteria to those belonging to provided list of criteria group UUIDs.
items:
type: string
globalOnly:
type: boolean
description: Limit response to include only organization level criteria. Mutually exclusive with `workspaces` parameter.
default: false
responses:
'201':
description: '201'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"OK\",\n \"result\": [\n {\n \"id\": 12345,\n \"name\": \"example criteria name 1\",\n \"rule\": \"example criteria rule 1\",\n \"bestPractice\": true,\n \"category\": \"Formatting\",\n \"channel\": \"META\",\n \"consideration\": \"MANDATORY\",\n \"criteriaGroups\": [\n {\n \"id\": \"9af107f0-5921-4253-80b9-298cc0b68d64\",\n \"name\": \"Example Group Name\"\n }\n ],\n \"creativeTypes\": [\n \"VIDEO\",\n \"ANIMATED_IMAGE\"\n ],\n \"dateCreated\": \"2024-06-07T06:18:20.000Z\",\n \"organizationCriteria\": true,\n \"person\": {\n \"email\": \"abc@xyz.com\",\n \"firstName\": \"Criteria\",\n \"lastName\": \"Cait\"\n },\n \"workspace\": null\n },\n {\n \"id\": 56789,\n \"name\": \"example criteria name 2\",\n \"rule\": \"example criteria rule 2\",\n \"bestPractice\": false,\n \"category\": \"Product Visibility\",\n \"channel\": \"META\",\n \"consideration\": \"MANDATORY\",\n \"criteriaGroups\": [\n {\n \"id\": \"9af107f0-5921-4253-80b9-298cc0b68d64\",\n \"name\": \"Example Group Name\"\n }\n ],\n \"creativeTypes\": [\n \"IMAGE\",\n \"VIDEO\",\n \"ANIMATED_IMAGE\"\n ],\n \"dateCreated\": \"2024-06-07T06:24:39.000Z\",\n \"organizationCriteria\": true,\n \"person\": {\n \"email\": \"abc@xyz.com\",\n \"firstName\": \"Criteria\",\n \"lastName\": \"Cait\"\n },\n \"workspace\": null\n },\n {\n \"id\": 13579,\n \"name\": \"example criteria name 3\",\n \"rule\": \"example criteria rule 3\",\n \"bestPractice\": false,\n \"category\": \"Regulatory & Compliance\",\n \"channel\": \"DV360\",\n \"consideration\": \"OPTIONAL\",\n \"criteriaGroups\": [],\n \"creativeTypes\": [\n \"VIDEO\"\n ],\n \"dateCreated\": \"2024-07-16T23:07:40.000Z\",\n \"organizationCriteria\": false,\n \"person\": {\n \"email\": \"abc@xyz.com\",\n \"firstName\": \"Criteria\",\n \"lastName\": \"Cait\"\n },\n \"workspace\": {\n \"id\": 73,\n \"name\": \"Example Workspace Name\"\n }\n }\n ],\n \"pagination\": {\n \"offset\": 0,\n \"perPage\": 3,\n \"nextOffset\": 3,\n \"totalSize\": 7\n }\n}"
schema:
type: object
properties:
status:
type: string
example: OK
result:
type: array
items:
type: object
properties:
id:
type: integer
example: 12345
default: 0
name:
type: string
example: example criteria name 1
rule:
type: string
example: example criteria rule 1
bestPractice:
type: boolean
example: true
default: true
category:
type: string
example: Formatting
channel:
type: string
example: META
consideration:
type: string
example: MANDATORY
criteriaGroups:
type: array
items:
type: object
properties:
id:
type: string
example: 9af107f0-5921-4253-80b9-298cc0b68d64
name:
type: string
example: Example Group Name
creativeTypes:
type: array
items:
type: string
example: VIDEO
dateCreated:
type: string
example: '2024-06-07T06:18:20.000Z'
organizationCriteria:
type: boolean
example: true
default: true
person:
type: object
properties:
email:
type: string
example: abc@xyz.com
firstName:
type: string
example: Criteria
lastName:
type: string
example: Cait
workspace: {}
pagination:
type: object
properties:
offset:
type: integer
example: 0
default: 0
perPage:
type: integer
example: 3
default: 0
nextOffset:
type: integer
example: 3
default: 0
totalSize:
type: integer
example: 7
default: 0
'400':
description: '400'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ERROR\",\n \"traceId\": \"1234567890\",\n \"error\": {\n \"identifier\": \"vidmob.api-bff.badrequestexception\",\n \"type\": \"BADREQUESTEXCEPTION\",\n \"system\": \"scoring\",\n \"message\": \"example bad request message\"\n }\n}"
schema:
type: object
properties:
status:
type: string
example: ERROR
traceId:
type: string
example: '1234567890'
error:
type: object
properties:
identifier:
type: string
example: vidmob.api-bff.badrequestexception
type:
type: string
example: BADREQUESTEXCEPTION
system:
type: string
example: scoring
message:
type: string
example: example bad request message
'401':
description: '401'
content:
application/json:
examples:
Result:
value: "{\n \"statusCode\": 401,\n \"message\": \"Request is Unauthorized\",\n \"error\": \"Unauthorized\"\n}"
schema:
type: object
properties:
statusCode:
type: integer
example: 401
default: 0
message:
type: string
example: Request is Unauthorized
error:
type: string
example: Unauthorized
deprecated: false
tags:
- Scoring
/v1/scoring/scorecard/{scorecardId}/media-metadata:
get:
summary: Get Scorecard Media Metadata
description: Fetches a list of metadata objects for media in a given scorecard. When a date range is provided, it applies only to inflight scorecards and retrieves media with impressions within that range. Dates are otherwise disregarded for preflight scorecards.
operationId: get_v1scoringworkspace{workspaceId}scorecards-1
parameters:
- in: path
name: scorecardId
schema:
type: string
default: ''
required: true
description: ID of the scorecard to fetch media metadata for.
- in: query
name: startDate
schema:
type: string
format: date
required: false
description: Impression start for inflight media—disregarded for preflight. Defaults to 3 months back.
- in: query
name: endDate
schema:
type: string
format: date
description: 'Impression end date—similarly disregarded for preflight. Defaults to current day. '
required: false
- in: query
name: perPage
schema:
type: integer
default: '10'
format: int32
description: Pagination parameter to set page size.
- in: query
name: offSet
schema:
type: integer
format: int32
description: Pagination parameter to specify offset from 0.
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value:
status: OK
pagination:
offset: 0
perPage: 1
nextOffset: 1
totalSize: 1
result:
- id: 999999
adAccount:
id: fb_example_001
name: FB - TEST - EXAMPLE - ACME CO
campaigns:
- id: cmp_fb_example_001
name: EXAMPLE_CAMPAIGN_2025_Q4_Awareness
ads:
- id: ad_fb_example_001
name: EXAMPLE_AD_20251028_FB_VIDEO_30s
impressions: 12345
platformMediaId: pm_fb_example_001
platform: FACEBOOK
assetDuration: 30
mediaType: VIDEO
brands:
- id: 00000000-0000-0000-0000-000000000000
name: Acme (Example)
campaignObjectives: []
adGroups:
- id: ag_fb_example_001
name: EXAMPLE_ADGROUP_A
markets:
- id: usa
'400':
description: '400'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ERROR\",\n \"traceId\": \"example-trace-id\",\n \"error\": {\n \"identifier\": \"vidmob.scoring.badrequestexception\",\n \"type\": \"BADREQUESTEXCEPTION\",\n \"system\": \"scoring\",\n \"message\": \"Example message\"\n }\n}"
schema:
type: object
properties:
status:
type: string
example: ERROR
traceId:
type: string
example: example-trace-id
error:
type: object
properties:
identifier:
type: string
example: vidmob.scoring.badrequestexception
type:
type: string
example: BADREQUESTEXCEPTION
system:
type: string
example: scoring
message:
type: string
example: Example message
'401':
description: '401'
content:
application/json:
examples:
Result:
value: "{\n \"statusCode\": 401,\n \"message\": \"Request is Unauthorized\",\n \"error\": \"Unauthorized\"\n}"
schema:
type: object
properties:
statusCode:
type: integer
example: 401
default: 0
message:
type: string
example: Request is Unauthorized
error:
type: string
example: Unauthorized
deprecated: false
security:
- sec0: []
tags:
- Scoring
components:
securitySchemes:
sec0:
type: apiKey
in: header
name: Authorization
x-bearer-format: bearer
x-readme:
headers: []
explorer-enabled: true
proxy-enabled: true
x-readme-fauxas: true