A submission is a creator's video in a program. In an organic program it's also linked to the post where it went live, and Lucra measures that post's views.
Submit work
First upload the video with purpose=submission. Then submit it, acting as the creator:
await lucra.as("crtr_026UYfiw1Y6OvUpuKWiOpeL").submissions.create({
body: {
program: "prog_00lhuAJjQgdtNt5WnqTBc95",
file: "file_03d3QVSYynIFwgmYzYd7opT",
note: "First cut",
},
})
- In an organic program, add
postUrl: the Instagram or TikTok post the video went live as. - To resubmit after a revision request, send
revisionOfwith the originalsub_…ID. - Submitting accepts any agreements the brand requires for submissions.
Review
Set status to approved, rejected or revision_requested. Add a note the creator sees:
await lucra.submissions.update({
path: { id: "sub_14XA4WGiSOmaVI3B4QLm4Fs" },
body: { status: "revision_requested", note: "Trim the intro to three seconds." },
})
An approved video can run as an ad.
A post in an organic program is approved or rejected once its measurement ends; approving it pays the creator on its measured views. Then release the payment with { "payment": "approved" }. Only the brand's owners and admins, or its own key, can do that.
Brand videos
A brand can add its own finished video to its library: upload it with purpose=ad_creative, then create a submission with { "file", "name" } and no program.
Endpoints
/v1/submissionsList submissions
const { data } = await lucra.submissions.list({
query: { program: "prog_…" },
})Query parameters
programprog_…creatorcrtr_…statusstringOne or more, comma-separated: pending, revision_requested, approved, live, rejected, measuring, withdrawn, archived.
Plus paging: limit, cursor, createdAfter and createdBefore.
Response200A page of items, 19 fields each, and nextCursorShow
idsub_…typeenumpost: the creator's published Instagram or TikTok post; video: an uploaded video.
videopostprogramprog_…nullablecreatorcrtr_…nullablerevisionOfsub_…nullablestatusenumA post measures its views first (measuring), then waits for review (pending). withdrawn: by the creator; archived: kept but hidden from lists unless
status=archivedis asked for.pendingrevision_requestedapprovedliverejectedmeasuringwithdrawnarchivedfeedbackstringnullableThe brand's note with its latest review, such as what to change in a revision.
shortIdstringnullableThe short ID shown in the app and ad names.
submittedAtstringnullabletagsstring[]mediaobjectnullableShow 6 child fieldsHide child fields
videoUrlstringnullablethumbnailUrlstringnullabledurationSecondsnumbernullablefileNamestringnullablesizenumbernullablecontentTypestringnullable
platformPostobjectnullableThe creator's published post this submission is, for a post.
Show 9 child fieldsHide child fields
idstringnullableThe post's ID on its platform.
platformenuminstagramtiktokurlstringnullablecaptionstringnullablemetricsobjectShow 5 child fieldsHide child fields
viewsnumbernullablelikesnumbernullablecommentsnumbernullablesharesnumbernullablesavesnumbernullable
publishedAtstringnullablepaidViewsnumbernullableViews counted toward pay once measurement ends.
measurementEndsAtstringnullablepaymentApprovedAtstringnullable
transcriptobjectnullableShow 3 child fieldsHide child fields
statusenumcompletedfailedpendingskippedunsupportedtextstringnullablesegmentsobject[]nullableThe transcript as timed lines,
startandendin seconds from the video's start.Show 3 child fieldsHide child fields
startnumberendnumbertextstring
adsobjectnullableShow 4 child fieldsHide child fields
identityenumnullablecreatorbrandlaunchedOnstring[]ownershipstringnullableprogramTypestringnullable
existingPostobjectA brand's existing TikTok post to boost (added with
post): no upload, it runs as itself. Absent for an uploaded video.Show 4 child fieldsHide child fields
connectionconn_…The TikTok ad connection it runs on.
handlestringnullablereadybooleanAuthorized to the advertiser, so campaigns can run it; false while waiting on the creator's Spark code, or once it expires.
authorizedUntilstringnullable
adAuthorizationobjectnullableThe newest ad authorization asked for it (GET /v1/ad-authorizations).
Show 5 child fieldsHide child fields
idadauth_…platformenummetatiktokstatusenumrequestedgrantedrevokedexpiredauthorizedAtstringnullableexpiresAtstringnullable
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/submissions/:idGet a submission
const { data } = await lucra.submissions.retrieve({
path: { id: "sub_…" },
})Path parameters
idsub_…· required
Response20019 fieldsShow
idsub_…typeenumpost: the creator's published Instagram or TikTok post; video: an uploaded video.
videopostprogramprog_…nullablecreatorcrtr_…nullablerevisionOfsub_…nullablestatusenumA post measures its views first (measuring), then waits for review (pending). withdrawn: by the creator; archived: kept but hidden from lists unless
status=archivedis asked for.pendingrevision_requestedapprovedliverejectedmeasuringwithdrawnarchivedfeedbackstringnullableThe brand's note with its latest review, such as what to change in a revision.
shortIdstringnullableThe short ID shown in the app and ad names.
submittedAtstringnullabletagsstring[]mediaobjectnullableShow 6 child fieldsHide child fields
videoUrlstringnullablethumbnailUrlstringnullabledurationSecondsnumbernullablefileNamestringnullablesizenumbernullablecontentTypestringnullable
platformPostobjectnullableThe creator's published post this submission is, for a post.
Show 9 child fieldsHide child fields
idstringnullableThe post's ID on its platform.
platformenuminstagramtiktokurlstringnullablecaptionstringnullablemetricsobjectShow 5 child fieldsHide child fields
viewsnumbernullablelikesnumbernullablecommentsnumbernullablesharesnumbernullablesavesnumbernullable
publishedAtstringnullablepaidViewsnumbernullableViews counted toward pay once measurement ends.
measurementEndsAtstringnullablepaymentApprovedAtstringnullable
transcriptobjectnullableShow 3 child fieldsHide child fields
statusenumcompletedfailedpendingskippedunsupportedtextstringnullablesegmentsobject[]nullableThe transcript as timed lines,
startandendin seconds from the video's start.Show 3 child fieldsHide child fields
startnumberendnumbertextstring
adsobjectnullableShow 4 child fieldsHide child fields
identityenumnullablecreatorbrandlaunchedOnstring[]ownershipstringnullableprogramTypestringnullable
existingPostobjectA brand's existing TikTok post to boost (added with
post): no upload, it runs as itself. Absent for an uploaded video.Show 4 child fieldsHide child fields
connectionconn_…The TikTok ad connection it runs on.
handlestringnullablereadybooleanAuthorized to the advertiser, so campaigns can run it; false while waiting on the creator's Spark code, or once it expires.
authorizedUntilstringnullable
adAuthorizationobjectnullableThe newest ad authorization asked for it (GET /v1/ad-authorizations).
Show 5 child fieldsHide child fields
idadauth_…platformenummetatiktokstatusenumrequestedgrantedrevokedexpiredauthorizedAtstringnullableexpiresAtstringnullable
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/submissionsSubmit work as a creator, or add a brand's own video, or an existing TikTok post to boost, to its library
const { data } = await lucra.submissions.create({
body: { program: "prog_…" },
})Body
programprog_…The program the work is for; required for a creator.
filefile_…The uploaded video; required unless
postis sent.notestringpostobjectAs a brand: an existing TikTok post to run as a Spark Ad, by its creator's Spark code, its link, or both.
Show 3 child fieldsHide child fields
connectionconn_…· requiredThe brand's TikTok ad connection that will run the post.
urlstringThe post's full link, like https://www.tiktok.com/@handle/video/7234…
sparkCodestringThe creator's Spark code for the post; without one, Lucra asks the creator.
postUrlstringThe URL of the creator's published Instagram or TikTok post this video is; organic programs pay on its views.
revisionOfsub_…attestationobjectThe creator's content-compliance confirmations.
Show 4 child fieldsHide child fields
disclosureIncludedboolean· requiredexperienceTruthfulboolean· requirednoUnapprovedClaimsboolean· requiredacceptedAgreementsobject[]The agreement versions the creator accepted by submitting; refused with 409 agreements_changed if the program now requires others.
Show 2 child fieldsHide child fields
agreementagr_…· requiredversioninteger· required
namestringA brand library video's title; defaults to its file name.
Response20119 fieldsShow
idsub_…typeenumpost: the creator's published Instagram or TikTok post; video: an uploaded video.
videopostprogramprog_…nullablecreatorcrtr_…nullablerevisionOfsub_…nullablestatusenumA post measures its views first (measuring), then waits for review (pending). withdrawn: by the creator; archived: kept but hidden from lists unless
status=archivedis asked for.pendingrevision_requestedapprovedliverejectedmeasuringwithdrawnarchivedfeedbackstringnullableThe brand's note with its latest review, such as what to change in a revision.
shortIdstringnullableThe short ID shown in the app and ad names.
submittedAtstringnullabletagsstring[]mediaobjectnullableShow 6 child fieldsHide child fields
videoUrlstringnullablethumbnailUrlstringnullabledurationSecondsnumbernullablefileNamestringnullablesizenumbernullablecontentTypestringnullable
platformPostobjectnullableThe creator's published post this submission is, for a post.
Show 9 child fieldsHide child fields
idstringnullableThe post's ID on its platform.
platformenuminstagramtiktokurlstringnullablecaptionstringnullablemetricsobjectShow 5 child fieldsHide child fields
viewsnumbernullablelikesnumbernullablecommentsnumbernullablesharesnumbernullablesavesnumbernullable
publishedAtstringnullablepaidViewsnumbernullableViews counted toward pay once measurement ends.
measurementEndsAtstringnullablepaymentApprovedAtstringnullable
transcriptobjectnullableShow 3 child fieldsHide child fields
statusenumcompletedfailedpendingskippedunsupportedtextstringnullablesegmentsobject[]nullableThe transcript as timed lines,
startandendin seconds from the video's start.Show 3 child fieldsHide child fields
startnumberendnumbertextstring
adsobjectnullableShow 4 child fieldsHide child fields
identityenumnullablecreatorbrandlaunchedOnstring[]ownershipstringnullableprogramTypestringnullable
existingPostobjectA brand's existing TikTok post to boost (added with
post): no upload, it runs as itself. Absent for an uploaded video.Show 4 child fieldsHide child fields
connectionconn_…The TikTok ad connection it runs on.
handlestringnullablereadybooleanAuthorized to the advertiser, so campaigns can run it; false while waiting on the creator's Spark code, or once it expires.
authorizedUntilstringnullable
adAuthorizationobjectnullableThe newest ad authorization asked for it (GET /v1/ad-authorizations).
Show 5 child fieldsHide child fields
idadauth_…platformenummetatiktokstatusenumrequestedgrantedrevokedexpiredauthorizedAtstringnullableexpiresAtstringnullable
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/submissions/:idReview, tag, file or archive a submission, or approve paying for a post; as its creator, withdraw it
const { data } = await lucra.submissions.update({
path: { id: "sub_…" },
body: { status: "pending" },
})Path parameters
idsub_…· required
Body
statusenumA post in an organic program is approved (paid on its measured views) or rejected; archived hides a rejected or withdrawn submission from lists (it stays readable, and lists with
status=archived); a creator sends withdrawn. Any member may approve, reject or request a revision (with a note); other changes need an owner or admin.pendingapprovedrejectedrevision_requestedwithdrawnarchivednotestringShown to the creator with a revision request or rejection.
tagsstring[]paymentstringFor an approved post: approves paying the creator its finalized earnings (the brand's owner, admin or own key).
approvedversioninteger
Response20019 fieldsShow
idsub_…typeenumpost: the creator's published Instagram or TikTok post; video: an uploaded video.
videopostprogramprog_…nullablecreatorcrtr_…nullablerevisionOfsub_…nullablestatusenumA post measures its views first (measuring), then waits for review (pending). withdrawn: by the creator; archived: kept but hidden from lists unless
status=archivedis asked for.pendingrevision_requestedapprovedliverejectedmeasuringwithdrawnarchivedfeedbackstringnullableThe brand's note with its latest review, such as what to change in a revision.
shortIdstringnullableThe short ID shown in the app and ad names.
submittedAtstringnullabletagsstring[]mediaobjectnullableShow 6 child fieldsHide child fields
videoUrlstringnullablethumbnailUrlstringnullabledurationSecondsnumbernullablefileNamestringnullablesizenumbernullablecontentTypestringnullable
platformPostobjectnullableThe creator's published post this submission is, for a post.
Show 9 child fieldsHide child fields
idstringnullableThe post's ID on its platform.
platformenuminstagramtiktokurlstringnullablecaptionstringnullablemetricsobjectShow 5 child fieldsHide child fields
viewsnumbernullablelikesnumbernullablecommentsnumbernullablesharesnumbernullablesavesnumbernullable
publishedAtstringnullablepaidViewsnumbernullableViews counted toward pay once measurement ends.
measurementEndsAtstringnullablepaymentApprovedAtstringnullable
transcriptobjectnullableShow 3 child fieldsHide child fields
statusenumcompletedfailedpendingskippedunsupportedtextstringnullablesegmentsobject[]nullableThe transcript as timed lines,
startandendin seconds from the video's start.Show 3 child fieldsHide child fields
startnumberendnumbertextstring
adsobjectnullableShow 4 child fieldsHide child fields
identityenumnullablecreatorbrandlaunchedOnstring[]ownershipstringnullableprogramTypestringnullable
existingPostobjectA brand's existing TikTok post to boost (added with
post): no upload, it runs as itself. Absent for an uploaded video.Show 4 child fieldsHide child fields
connectionconn_…The TikTok ad connection it runs on.
handlestringnullablereadybooleanAuthorized to the advertiser, so campaigns can run it; false while waiting on the creator's Spark code, or once it expires.
authorizedUntilstringnullable
adAuthorizationobjectnullableThe newest ad authorization asked for it (GET /v1/ad-authorizations).
Show 5 child fieldsHide child fields
idadauth_…platformenummetatiktokstatusenumrequestedgrantedrevokedexpiredauthorizedAtstringnullableexpiresAtstringnullable
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring