A program is a brief with pay terms. Creators join it through an application, submit work, and get paid on approval or on how their work performs.
Create a program
A program needs a name, a type, a visibility and its pay. This one pays $8 per 1,000 views on creators' posts, up to $500 each:
{
"name": "Spring launch",
"type": "organic",
"visibility": "network",
"brief": "Show the jacket on a real trail run.",
"pay": {
"rules": [{ "per": "view", "amount": 800, "unit": 1000 }],
"cap": 50000,
"schedule": { "after": "measurement", "days": 7 }
},
"promoted": { "products": ["prod_04bst9MGXqblfqHhbR1iGGL"] },
"agreements": ["agr_0HxY6vD1bN4tK8qLm2Rz9sW"]
}
typeisorganic(paid on creators' own posts) orpaid_ads(paid on ads made from their work).visibilityisinvite(only creators you add) ornetwork(any creator can apply).promoted.productsare the products creators can request samples of.agreementsare the agreements creators accept by joining.
The brand needs a payment method first, or you get 409 requirement_payment_method.
PATCH /v1/programs/:id changes any of these. Every change in one request applies together, or none does. Set status to paused, open or archived.
Pay
Each type pays per result in its own way:
| Type | Paid per result | When |
|---|---|---|
paid_ads | A percent of ad spend or revenue, or per lead | As results come in |
organic | Per 1,000 views, or per post | After a 1–30 day measurement |
On top of that, add flat pay per approved submission, per install, per click, or per conversion on the brand's site, all under a cap. The full pay object is described in Payments. Pay that could never be paid as set is refused with 422 invalid_pay.
Changing a program's pay creates a new version. Creators already in the program move to it on their next action there. To set one creator's pay, send pay on PATCH /v1/applications/:id.
Applications
An application is a creator's place in a program. There are two ways in:
- A brand adds a creator with
{ "program", "creator" }. They join approved and are notified. - A creator applies to a
networkprogram with{ "program" }, acting as themselves.
await lucra.applications.create({
body: { program: "prog_00lhuAJjQgdtNt5WnqTBc95", creator: "crtr_026UYfiw1Y6OvUpuKWiOpeL" },
})
Review an application with PATCH /v1/applications/:id and status: approved, rejected, or pending to reopen it.
Applying or joining is how a creator accepts the program's agreements; there's no separate signing step. Show the agreements under your button, like "By applying you agree to …". A creator a brand added still has to accept while agreementsRequired is true: they do it with PATCH /v1/applications/:id and { "status": "approved" }.
Agreements
Publish a PDF (uploaded with purpose=agreement) with POST /v1/agreements, then list it in a program's agreements. GET /v1/agreements/acceptances lists who accepted what.
Posts
GET /v1/posts lists the creators' posts your organic programs pay for, with their views and earnings.
Endpoints
/v1/applicationsList applications
const { data } = await lucra.applications.list({
query: { program: "prog_…" },
})Query parameters
programprog_…creatorcrtr_…statusstringOne or more, comma-separated: pending, approved, rejected, withdrawn.
Plus paging: limit, cursor, createdAfter and createdBefore.
Response200A page of items, 15 fields each, and nextCursorShow
idappl_…programprog_…creatorcrtr_…statusenumpendingapprovedrejectedwithdrawnremovedbooleanRejected after being approved: the brand took the creator out of the program.
payobjectnullablePay the brand set for this creator over the program's (PATCH
pay); null when the program's pay applies.acceptedAtis set by the creator's next action in the program.Show 2 child fieldsHide child fields
overrideobjectShow 3 child fieldsHide child fields
rulesobject[]capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobject
acceptedAtstringnullable
payVersionintegernullableThe program pay version this creator is paid on; null until admitted. Below the program's
payVersionuntil their next action in the program accepts the newer pay.payStatusenumpast_due once a charge for this creator's program pay failed its last retry; back to current when a retry succeeds on an updated payment method.
currentpast_dueagreementsRequiredbooleanThe brand invited the creator, who still has to accept the program's agreements; the application is approved once they do.
reviewedAtstringnullableagreementsany[]On GET /v1/applications/:id as the creator while
agreementsRequired: what joining accepts.partnerFeeobjectnullableWith
agreements: the share of the creator's pay their partner takes, if any.Show 2 child fieldsHide child fields
partnerstringpercentnumber
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/applications/:idGet an application
const { data } = await lucra.applications.retrieve({
path: { id: "appl_…" },
})Path parameters
idappl_…· required
Response20015 fieldsShow
idappl_…programprog_…creatorcrtr_…statusenumpendingapprovedrejectedwithdrawnremovedbooleanRejected after being approved: the brand took the creator out of the program.
payobjectnullablePay the brand set for this creator over the program's (PATCH
pay); null when the program's pay applies.acceptedAtis set by the creator's next action in the program.Show 2 child fieldsHide child fields
overrideobjectShow 3 child fieldsHide child fields
rulesobject[]capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobject
acceptedAtstringnullable
payVersionintegernullableThe program pay version this creator is paid on; null until admitted. Below the program's
payVersionuntil their next action in the program accepts the newer pay.payStatusenumpast_due once a charge for this creator's program pay failed its last retry; back to current when a retry succeeds on an updated payment method.
currentpast_dueagreementsRequiredbooleanThe brand invited the creator, who still has to accept the program's agreements; the application is approved once they do.
reviewedAtstringnullableagreementsany[]On GET /v1/applications/:id as the creator while
agreementsRequired: what joining accepts.partnerFeeobjectnullableWith
agreements: the share of the creator's pay their partner takes, if any.Show 2 child fieldsHide child fields
partnerstringpercentnumber
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/applicationsInvite a creator to a program, or apply as one
const { data } = await lucra.applications.create({
body: { program: "prog_…" },
})Body
programprog_…· requiredcreatorcrtr_…
Response20115 fieldsShow
idappl_…programprog_…creatorcrtr_…statusenumpendingapprovedrejectedwithdrawnremovedbooleanRejected after being approved: the brand took the creator out of the program.
payobjectnullablePay the brand set for this creator over the program's (PATCH
pay); null when the program's pay applies.acceptedAtis set by the creator's next action in the program.Show 2 child fieldsHide child fields
overrideobjectShow 3 child fieldsHide child fields
rulesobject[]capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobject
acceptedAtstringnullable
payVersionintegernullableThe program pay version this creator is paid on; null until admitted. Below the program's
payVersionuntil their next action in the program accepts the newer pay.payStatusenumpast_due once a charge for this creator's program pay failed its last retry; back to current when a retry succeeds on an updated payment method.
currentpast_dueagreementsRequiredbooleanThe brand invited the creator, who still has to accept the program's agreements; the application is approved once they do.
reviewedAtstringnullableagreementsany[]On GET /v1/applications/:id as the creator while
agreementsRequired: what joining accepts.partnerFeeobjectnullableWith
agreements: the share of the creator's pay their partner takes, if any.Show 2 child fieldsHide child fields
partnerstringpercentnumber
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/applications/:idApprove, reject or reopen an application, or set the creator's pay; as the creator, withdraw it or accept an invitation (approved)
const { data } = await lucra.applications.update({
path: { id: "appl_…" },
body: { status: "pending" },
})Path parameters
idappl_…· required
Body
statusenumpending reopens a decided application for review; a creator withdraws their own with withdrawn, or joins a program they're invited to with approved, accepting its agreements.
pendingapprovedrejectedwithdrawnpayobjectnullableMerged over the program's pay for this creator; null returns them to the program's pay.
Show 3 child fieldsHide child fields
rulesobject[]capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobject
versioninteger
Response20015 fieldsShow
idappl_…programprog_…creatorcrtr_…statusenumpendingapprovedrejectedwithdrawnremovedbooleanRejected after being approved: the brand took the creator out of the program.
payobjectnullablePay the brand set for this creator over the program's (PATCH
pay); null when the program's pay applies.acceptedAtis set by the creator's next action in the program.Show 2 child fieldsHide child fields
overrideobjectShow 3 child fieldsHide child fields
rulesobject[]capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobject
acceptedAtstringnullable
payVersionintegernullableThe program pay version this creator is paid on; null until admitted. Below the program's
payVersionuntil their next action in the program accepts the newer pay.payStatusenumpast_due once a charge for this creator's program pay failed its last retry; back to current when a retry succeeds on an updated payment method.
currentpast_dueagreementsRequiredbooleanThe brand invited the creator, who still has to accept the program's agreements; the application is approved once they do.
reviewedAtstringnullableagreementsany[]On GET /v1/applications/:id as the creator while
agreementsRequired: what joining accepts.partnerFeeobjectnullableWith
agreements: the share of the creator's pay their partner takes, if any.Show 2 child fieldsHide child fields
partnerstringpercentnumber
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/agreements/acceptancesList creators' acceptances of your agreements; as a creator, the ones you accepted and the ones waiting on you
const { data } = await lucra.agreements.acceptances.list({
query: { agreement: "agr_…" },
})Query parameters
agreementagr_…creatorcrtr_…statusenumpending: offers and invitations waiting on a creator; only a creator lists these.
acceptedpending
Plus paging: limit, cursor, createdAfter and createdBefore.
Response200A page of items, 13 fields each, and nextCursorShow
idagac_…statusenumacceptedpendingaccountacct_…The brand whose agreement it is.
brandNamestringcreatorcrtr_…creatorNamestringnullablecontextenumcreator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionprogramprog_…nullableretainerret_…nullabletitlestringdocumentanynullableThe version accepted; null while pending.
acceptedAtstringnullablecreatedAtstring
/v1/agreementsList agreements
const { data } = await lucra.agreements.list({
query: { status: "…" },
})Query parameters
statusstringOne or more, comma-separated: active, archived.
Plus paging: limit, cursor, createdAfter and createdBefore.
Response200A page of items, 11 fields each, and nextCursorShow
idagr_…titlestringdescriptionstringnullablestatusenumactivearchivedapplicabilityenum[]Where every creator must accept it: creator_relationship, program_application, program_enrollment, retainer or content_submission.
creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionlatestVersionobjectnullableEvery version: GET /v1/agreements/:id/versions.
Show 9 child fieldsHide child fields
agreementagr_…versionintegerfilefile_…nullablefileNamestringsizeintegersha256stringapplicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissioncreatedAtstringurlstringnullableA short-lived link to the PDF.
acceptedCountintegerCreators who accepted a version; each acceptance: GET /v1/agreements/acceptances?agreement=…
pendingCountintegerversionintegerSend it back as
versionto reject a change based on a stale read.createdAtstringupdatedAtstring
/v1/agreements/:idGet an agreement
const { data } = await lucra.agreements.retrieve({
path: { id: "agr_…" },
})Path parameters
idagr_…· required
Response20011 fieldsShow
idagr_…titlestringdescriptionstringnullablestatusenumactivearchivedapplicabilityenum[]Where every creator must accept it: creator_relationship, program_application, program_enrollment, retainer or content_submission.
creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionlatestVersionobjectnullableEvery version: GET /v1/agreements/:id/versions.
Show 9 child fieldsHide child fields
agreementagr_…versionintegerfilefile_…nullablefileNamestringsizeintegersha256stringapplicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissioncreatedAtstringurlstringnullableA short-lived link to the PDF.
acceptedCountintegerCreators who accepted a version; each acceptance: GET /v1/agreements/acceptances?agreement=…
pendingCountintegerversionintegerSend it back as
versionto reject a change based on a stale read.createdAtstringupdatedAtstring
/v1/agreements/:id/versionsList an agreement's versions, newest first
const { data } = await lucra.agreements.versions.list({
path: { id: "agr_…" },
})Path parameters
idagr_…· required
Query parameters
Plus paging: limit, cursor, createdAfter and createdBefore.
Response200A page of items, 9 fields each, and nextCursorShow
agreementagr_…versionintegerfilefile_…nullablefileNamestringsizeintegersha256stringapplicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissioncreatedAtstringurlstringnullableA short-lived link to the PDF.
/v1/agreements/:id/versions/:numberGet a version of an agreement by its number
const { data } = await lucra.agreements.versions.retrieve({
path: { id: "agr_…", number: "…" },
})Path parameters
idagr_…· requirednumberstring· required
Response2009 fieldsShow
agreementagr_…versionintegerfilefile_…nullablefileNamestringsizeintegersha256stringapplicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissioncreatedAtstringurlstringnullableA short-lived link to the PDF.
/v1/agreementsPublish an agreement
const { data } = await lucra.agreements.create({
body: { file: "file_…", title: "…" },
})Body
filefile_…· requiredA ready PDF uploaded with POST /v1/files?purpose=agreement.
titlestring· requireddescriptionstringnullableapplicabilityenum[]Where every creator must accept it; empty (the default) for an agreement only the programs that list it require.
creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submission
Response20111 fieldsShow
idagr_…titlestringdescriptionstringnullablestatusenumactivearchivedapplicabilityenum[]Where every creator must accept it: creator_relationship, program_application, program_enrollment, retainer or content_submission.
creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionlatestVersionobjectnullableEvery version: GET /v1/agreements/:id/versions.
Show 9 child fieldsHide child fields
agreementagr_…versionintegerfilefile_…nullablefileNamestringsizeintegersha256stringapplicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissioncreatedAtstringurlstringnullableA short-lived link to the PDF.
acceptedCountintegerCreators who accepted a version; each acceptance: GET /v1/agreements/acceptances?agreement=…
pendingCountintegerversionintegerSend it back as
versionto reject a change based on a stale read.createdAtstringupdatedAtstring
/v1/agreements/:id/versionsPublish a new version of an agreement
const { data } = await lucra.agreements.versions.create({
path: { id: "agr_…" },
body: { file: "file_…", title: "…" },
})Path parameters
idagr_…· required
Body
filefile_…· requiredA ready PDF uploaded with POST /v1/files?purpose=agreement.
titlestring· requireddescriptionstringnullableapplicabilityenum[]Where every creator must accept it; empty (the default) for an agreement only the programs that list it require.
creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionversioninteger
Response20111 fieldsShow
idagr_…titlestringdescriptionstringnullablestatusenumactivearchivedapplicabilityenum[]Where every creator must accept it: creator_relationship, program_application, program_enrollment, retainer or content_submission.
creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionlatestVersionobjectnullableEvery version: GET /v1/agreements/:id/versions.
Show 9 child fieldsHide child fields
agreementagr_…versionintegerfilefile_…nullablefileNamestringsizeintegersha256stringapplicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissioncreatedAtstringurlstringnullableA short-lived link to the PDF.
acceptedCountintegerCreators who accepted a version; each acceptance: GET /v1/agreements/acceptances?agreement=…
pendingCountintegerversionintegerSend it back as
versionto reject a change based on a stale read.createdAtstringupdatedAtstring
/v1/agreements/:idChange where an agreement is required, or archive it
const { data } = await lucra.agreements.update({
path: { id: "agr_…" },
body: { applicability: ["creator_relationship"] },
})Path parameters
idagr_…· required
Body
applicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionstatusstringarchivedversioninteger
Response20011 fieldsShow
idagr_…titlestringdescriptionstringnullablestatusenumactivearchivedapplicabilityenum[]Where every creator must accept it: creator_relationship, program_application, program_enrollment, retainer or content_submission.
creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissionlatestVersionobjectnullableEvery version: GET /v1/agreements/:id/versions.
Show 9 child fieldsHide child fields
agreementagr_…versionintegerfilefile_…nullablefileNamestringsizeintegersha256stringapplicabilityenum[]creator_relationshipprogram_applicationprogram_enrollmentretainercontent_submissioncreatedAtstringurlstringnullableA short-lived link to the PDF.
acceptedCountintegerCreators who accepted a version; each acceptance: GET /v1/agreements/acceptances?agreement=…
pendingCountintegerversionintegerSend it back as
versionto reject a change based on a stale read.createdAtstringupdatedAtstring
/v1/postsList creators' posts in organic programs
const { data } = await lucra.posts.list({
query: { program: "prog_…" },
})Query parameters
programprog_…creatorcrtr_…platformenuminstagramtiktokstatusstringDefaults to every status but archived.
Plus paging: limit, cursor, createdAfter and createdBefore.
Response200A page of items, 26 fields each, and nextCursorShow
idpost_…submissionsub_…creatorcrtr_…programprog_…connectionconn_…nullabletitlestringcreatorNamestringhandlestringplatformenuminstagramtiktokprogramNamestringproductprod_…nullableurlstringnullablevideoUrlstringnullablethumbnailUrlstringnullablestatusenumtracking (views being measured), ready_for_review, approved (reviewed; its payment waits on approval), payment_approved, paid or rejected; archived once hidden from the brand's view.
trackingready_for_reviewapprovedpayment_approvedpaidrejectedarchivedconfidenceenumThe fraud check on the post's views.
looks_goodneeds_reviewnot_enough_datareasonstringamountintegerWhat the creator earns (net); an estimate while the post is tracking.
currencystringLowercase ISO 4217 code, e.g. usd.
eligibleViewsnumbernullabletagsobject[]Each tag with the color it was assigned with.
Show 2 child fieldsHide child fields
namestringcolorenumgreydark_greypurpletealgreenyelloworangepink
dailyobject[]Show 6 child fieldsHide child fields
datestringviewsnumberengagementsnumbernullablelikesnumbernullablecommentsnumbernullablesharesnumbernullable
evidenceanyOn GET /v1/posts/:id: the claim's measurement windows, hourly snapshots, risk reasons, review history and payout account status.
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/posts/:idGet a post with its claim evidence
const { data } = await lucra.posts.retrieve({
path: { id: "post_…" },
})Path parameters
idpost_…· required
Response20026 fieldsShow
idpost_…submissionsub_…creatorcrtr_…programprog_…connectionconn_…nullabletitlestringcreatorNamestringhandlestringplatformenuminstagramtiktokprogramNamestringproductprod_…nullableurlstringnullablevideoUrlstringnullablethumbnailUrlstringnullablestatusenumtracking (views being measured), ready_for_review, approved (reviewed; its payment waits on approval), payment_approved, paid or rejected; archived once hidden from the brand's view.
trackingready_for_reviewapprovedpayment_approvedpaidrejectedarchivedconfidenceenumThe fraud check on the post's views.
looks_goodneeds_reviewnot_enough_datareasonstringamountintegerWhat the creator earns (net); an estimate while the post is tracking.
currencystringLowercase ISO 4217 code, e.g. usd.
eligibleViewsnumbernullabletagsobject[]Each tag with the color it was assigned with.
Show 2 child fieldsHide child fields
namestringcolorenumgreydark_greypurpletealgreenyelloworangepink
dailyobject[]Show 6 child fieldsHide child fields
datestringviewsnumberengagementsnumbernullablelikesnumbernullablecommentsnumbernullablesharesnumbernullable
evidenceanyOn GET /v1/posts/:id: the claim's measurement windows, hourly snapshots, risk reasons, review history and payout account status.
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/posts/:idTag or archive a post
const { data } = await lucra.posts.update({
path: { id: "post_…" },
body: { version: 1000 },
})Path parameters
idpost_…· required
Body
versionintegertagobjectShow 2 child fieldsHide child fields
namestring· requiredcolorenum· requiredgreydark_greypurpletealgreenyelloworangepink
assignedbooleanWith tag: add (true) or remove (false) it.
statusstringHides the post from the brand's view.
archived
Response20026 fieldsShow
idpost_…submissionsub_…creatorcrtr_…programprog_…connectionconn_…nullabletitlestringcreatorNamestringhandlestringplatformenuminstagramtiktokprogramNamestringproductprod_…nullableurlstringnullablevideoUrlstringnullablethumbnailUrlstringnullablestatusenumtracking (views being measured), ready_for_review, approved (reviewed; its payment waits on approval), payment_approved, paid or rejected; archived once hidden from the brand's view.
trackingready_for_reviewapprovedpayment_approvedpaidrejectedarchivedconfidenceenumThe fraud check on the post's views.
looks_goodneeds_reviewnot_enough_datareasonstringamountintegerWhat the creator earns (net); an estimate while the post is tracking.
currencystringLowercase ISO 4217 code, e.g. usd.
eligibleViewsnumbernullabletagsobject[]Each tag with the color it was assigned with.
Show 2 child fieldsHide child fields
namestringcolorenumgreydark_greypurpletealgreenyelloworangepink
dailyobject[]Show 6 child fieldsHide child fields
datestringviewsnumberengagementsnumbernullablelikesnumbernullablecommentsnumbernullablesharesnumbernullable
evidenceanyOn GET /v1/posts/:id: the claim's measurement windows, hourly snapshots, risk reasons, review history and payout account status.
versionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/programsList programs: your own (archived ones only with status=archived), or with scope=network the open programs on the Lucra Network
const { data } = await lucra.programs.list({
query: { scope: "network" },
})Query parameters
scopestringThe Lucra Network's open programs instead of your own.
networkvisibilityenuminvitenetworkstatusenumdraftopenpausedclosedarchived
Plus paging: limit, cursor, createdAfter and createdBefore.
Response200A page of items, 37 fields each, and nextCursorShow
idprog_…accountacct_…The brand that runs the program.
brandNamestringThe brand's display name. Network programs are seen by creators who can't read the brand's account.
brandAvatarUrlstringnullableA short-lived link to the brand's picture.
joinedCreatorCountintegerCreators approved to the program.
joinedCreatorsobject[]A preview of up to four live, joined creators. Only public profile names and pictures.
Show 4 child fieldsHide child fields
idcrtr_…namestringinitialsstringavatarUrlstringnullable
namestringtypeenumorganicpaid_adsstatusenumdraftopenpausedclosedarchivedvisibilityenuminvite: creators the brand invites; network: any creator can find it and apply.
invitenetworkbriefstringnullableWhat creators read before applying.
platformsenum[]instagramtiktokpaidSocialPlatformsenum[]instagramtiktokallowManualOrganicUploadbooleanallowPaidPromotionbooleanallowPaidSocialUploadsbooleanrequireAdAuthorizationbooleanCreators grant an ad authorization (a Meta partnership; on TikTok, their account approved to your Business Center) before their work runs as a creator-identity ad.
submissionLimitsobjectShow 4 child fieldsHide child fields
modeenumlimitedunlimitedmaxnumberconcurrentModeenumlimitedunlimitedconcurrentMaxnumber
payobjectWhat creators earn. A creator reading the program sees their own pay, with any terms the brand set for them.
Show 5 child fieldsHide child fields
rulesobject[]baseintegerGuaranteed each period, in cents.
capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobjectapprovalenumautomatic pays each period on its own; manual waits for the brand to approve the calculated amount.
automaticmanual
paySummarystringThe pay in plain English, ready to show.
payVersionintegerThe pay's version, bumped by each pay edit. Admitted creators move to it on their next action in the program; each application shows the version it's on.
payIssuesobject[]Ways the program's pay can't be paid as set, for the brand to fix; it keeps paying as it does until then. Empty when there are none, and on programs seen on the network.
Show 3 child fieldsHide child fields
codeenumpay_invalid_valuepay_cap_zeropay_cap_below_amountpay_cap_requiredpay_base_needs_periodpay_schedule_mismatchpay_duplicate_rulepay_scope_invalidpay_exceeds_budgetpay_primary_missingpay_primary_changedpay_program_unsupportedpathstringmessagestring
promotedobjectShow 4 child fieldsHide child fields
typeenumnullableappofferotherproductsitenamestringnullableurlstringnullableproductsprod_…[]Catalog products, first one primary.
briefFilesobject[]Show 6 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablepreviewobjectnullableShow 3 child fieldsHide child fields
urlstringcontentTypestringnullablesizenumbernullable
referenceVideosobject[]Show 7 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablewidthnumbernullableheightnumbernullable
agreementsany[]The agreements applying accepts: each one's current version.
submissionAgreementsany[]The agreements submitting work to the program accepts.
currencystringLowercase ISO 4217 code, e.g. usd.
budgetobjectnullableThe brand's own numbers; null on programs seen on the network.
Show 1 child fieldHide child fields
amountnumbernullableThe planned budget.
adSpendobjectnullableShow 2 child fieldsHide child fields
totalnumberbyPlatformobject[]Show 2 child fieldsHide child fields
platformstringamountnumber
partnerApprovalobjectnullableShow 3 child fieldsHide child fields
statusenumdraftpendingapprovedrejectedchanges_requestedlaunchednotestringnullablerequestedAtstringnullable
createdByPartneracct_…nullablestartsAtstringnullableendsAtstringnullableversionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/programs/:idGet a program
const { data } = await lucra.programs.retrieve({
path: { id: "prog_…" },
})Path parameters
idprog_…· required
Response20037 fieldsShow
idprog_…accountacct_…The brand that runs the program.
brandNamestringThe brand's display name. Network programs are seen by creators who can't read the brand's account.
brandAvatarUrlstringnullableA short-lived link to the brand's picture.
joinedCreatorCountintegerCreators approved to the program.
joinedCreatorsobject[]A preview of up to four live, joined creators. Only public profile names and pictures.
Show 4 child fieldsHide child fields
idcrtr_…namestringinitialsstringavatarUrlstringnullable
namestringtypeenumorganicpaid_adsstatusenumdraftopenpausedclosedarchivedvisibilityenuminvite: creators the brand invites; network: any creator can find it and apply.
invitenetworkbriefstringnullableWhat creators read before applying.
platformsenum[]instagramtiktokpaidSocialPlatformsenum[]instagramtiktokallowManualOrganicUploadbooleanallowPaidPromotionbooleanallowPaidSocialUploadsbooleanrequireAdAuthorizationbooleanCreators grant an ad authorization (a Meta partnership; on TikTok, their account approved to your Business Center) before their work runs as a creator-identity ad.
submissionLimitsobjectShow 4 child fieldsHide child fields
modeenumlimitedunlimitedmaxnumberconcurrentModeenumlimitedunlimitedconcurrentMaxnumber
payobjectWhat creators earn. A creator reading the program sees their own pay, with any terms the brand set for them.
Show 5 child fieldsHide child fields
rulesobject[]baseintegerGuaranteed each period, in cents.
capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobjectapprovalenumautomatic pays each period on its own; manual waits for the brand to approve the calculated amount.
automaticmanual
paySummarystringThe pay in plain English, ready to show.
payVersionintegerThe pay's version, bumped by each pay edit. Admitted creators move to it on their next action in the program; each application shows the version it's on.
payIssuesobject[]Ways the program's pay can't be paid as set, for the brand to fix; it keeps paying as it does until then. Empty when there are none, and on programs seen on the network.
Show 3 child fieldsHide child fields
codeenumpay_invalid_valuepay_cap_zeropay_cap_below_amountpay_cap_requiredpay_base_needs_periodpay_schedule_mismatchpay_duplicate_rulepay_scope_invalidpay_exceeds_budgetpay_primary_missingpay_primary_changedpay_program_unsupportedpathstringmessagestring
promotedobjectShow 4 child fieldsHide child fields
typeenumnullableappofferotherproductsitenamestringnullableurlstringnullableproductsprod_…[]Catalog products, first one primary.
briefFilesobject[]Show 6 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablepreviewobjectnullableShow 3 child fieldsHide child fields
urlstringcontentTypestringnullablesizenumbernullable
referenceVideosobject[]Show 7 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablewidthnumbernullableheightnumbernullable
agreementsany[]The agreements applying accepts: each one's current version.
submissionAgreementsany[]The agreements submitting work to the program accepts.
currencystringLowercase ISO 4217 code, e.g. usd.
budgetobjectnullableThe brand's own numbers; null on programs seen on the network.
Show 1 child fieldHide child fields
amountnumbernullableThe planned budget.
adSpendobjectnullableShow 2 child fieldsHide child fields
totalnumberbyPlatformobject[]Show 2 child fieldsHide child fields
platformstringamountnumber
partnerApprovalobjectnullableShow 3 child fieldsHide child fields
statusenumdraftpendingapprovedrejectedchanges_requestedlaunchednotestringnullablerequestedAtstringnullable
createdByPartneracct_…nullablestartsAtstringnullableendsAtstringnullableversionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/programsCreate a program
const { data } = await lucra.programs.create({
body: { name: "…", type: "organic", visibility: "invite" },
})Body
namestring· requiredtypeenum· requiredorganicpaid_adsvisibilityenum· requiredinvitenetworkbriefstringplatformsenum[]instagramtiktokpaidSocialPlatformsenum[]instagramtiktokallowManualOrganicUploadbooleanallowPaidPromotionbooleanallowPaidSocialUploadsbooleanrequireAdAuthorizationbooleansubmissionLimitsobjectShow 4 child fieldsHide child fields
modeenumlimitedunlimitedmaxintegerconcurrentModeenumlimitedunlimitedconcurrentMaxinteger
payobject· requiredShow 5 child fieldsHide child fields
rulesobject[]baseintegerGuaranteed each period, in cents.
capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobject· requiredapprovalenumautomatic pays each period on its own; manual waits for the brand to approve the calculated amount.
automaticmanual
promotedobjectShow 4 child fieldsHide child fields
typeenumappofferotherproductsitenamestringurlstringproductsprod_…[]
budgetobjectShow 1 child fieldHide child fields
amountinteger
briefFilesfile_…[]referenceVideosfile_…[]agreementsagr_…[]
Response20137 fieldsShow
idprog_…accountacct_…The brand that runs the program.
brandNamestringThe brand's display name. Network programs are seen by creators who can't read the brand's account.
brandAvatarUrlstringnullableA short-lived link to the brand's picture.
joinedCreatorCountintegerCreators approved to the program.
joinedCreatorsobject[]A preview of up to four live, joined creators. Only public profile names and pictures.
Show 4 child fieldsHide child fields
idcrtr_…namestringinitialsstringavatarUrlstringnullable
namestringtypeenumorganicpaid_adsstatusenumdraftopenpausedclosedarchivedvisibilityenuminvite: creators the brand invites; network: any creator can find it and apply.
invitenetworkbriefstringnullableWhat creators read before applying.
platformsenum[]instagramtiktokpaidSocialPlatformsenum[]instagramtiktokallowManualOrganicUploadbooleanallowPaidPromotionbooleanallowPaidSocialUploadsbooleanrequireAdAuthorizationbooleanCreators grant an ad authorization (a Meta partnership; on TikTok, their account approved to your Business Center) before their work runs as a creator-identity ad.
submissionLimitsobjectShow 4 child fieldsHide child fields
modeenumlimitedunlimitedmaxnumberconcurrentModeenumlimitedunlimitedconcurrentMaxnumber
payobjectWhat creators earn. A creator reading the program sees their own pay, with any terms the brand set for them.
Show 5 child fieldsHide child fields
rulesobject[]baseintegerGuaranteed each period, in cents.
capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobjectapprovalenumautomatic pays each period on its own; manual waits for the brand to approve the calculated amount.
automaticmanual
paySummarystringThe pay in plain English, ready to show.
payVersionintegerThe pay's version, bumped by each pay edit. Admitted creators move to it on their next action in the program; each application shows the version it's on.
payIssuesobject[]Ways the program's pay can't be paid as set, for the brand to fix; it keeps paying as it does until then. Empty when there are none, and on programs seen on the network.
Show 3 child fieldsHide child fields
codeenumpay_invalid_valuepay_cap_zeropay_cap_below_amountpay_cap_requiredpay_base_needs_periodpay_schedule_mismatchpay_duplicate_rulepay_scope_invalidpay_exceeds_budgetpay_primary_missingpay_primary_changedpay_program_unsupportedpathstringmessagestring
promotedobjectShow 4 child fieldsHide child fields
typeenumnullableappofferotherproductsitenamestringnullableurlstringnullableproductsprod_…[]Catalog products, first one primary.
briefFilesobject[]Show 6 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablepreviewobjectnullableShow 3 child fieldsHide child fields
urlstringcontentTypestringnullablesizenumbernullable
referenceVideosobject[]Show 7 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablewidthnumbernullableheightnumbernullable
agreementsany[]The agreements applying accepts: each one's current version.
submissionAgreementsany[]The agreements submitting work to the program accepts.
currencystringLowercase ISO 4217 code, e.g. usd.
budgetobjectnullableThe brand's own numbers; null on programs seen on the network.
Show 1 child fieldHide child fields
amountnumbernullableThe planned budget.
adSpendobjectnullableShow 2 child fieldsHide child fields
totalnumberbyPlatformobject[]Show 2 child fieldsHide child fields
platformstringamountnumber
partnerApprovalobjectnullableShow 3 child fieldsHide child fields
statusenumdraftpendingapprovedrejectedchanges_requestedlaunchednotestringnullablerequestedAtstringnullable
createdByPartneracct_…nullablestartsAtstringnullableendsAtstringnullableversionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring
/v1/programs/:idUpdate a program; every change in one request applies together, or none does
const { data } = await lucra.programs.update({
path: { id: "prog_…" },
body: { name: "…" },
})Path parameters
idprog_…· required
Body
namestringbriefstringstatusenumdraftopenpausedarchivedvisibilityenuminvitenetworksubmissionLimitsobjectShow 4 child fieldsHide child fields
modeenumlimitedunlimitedmaxintegerconcurrentModeenumlimitedunlimitedconcurrentMaxinteger
promotedobjectReplaces the promoted catalog products, first one primary.
Show 1 child fieldHide child fields
productsprod_…[]· required
briefFilesfile_…[]referenceVideosfile_…[]agreementsagr_…[]payobjectShow 5 child fieldsHide child fields
rulesobject[]baseintegerGuaranteed each period, in cents.
capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobject· requiredapprovalenumautomatic pays each period on its own; manual waits for the brand to approve the calculated amount.
automaticmanual
budgetobjectShow 1 child fieldHide child fields
amountinteger
versioninteger
Response20037 fieldsShow
idprog_…accountacct_…The brand that runs the program.
brandNamestringThe brand's display name. Network programs are seen by creators who can't read the brand's account.
brandAvatarUrlstringnullableA short-lived link to the brand's picture.
joinedCreatorCountintegerCreators approved to the program.
joinedCreatorsobject[]A preview of up to four live, joined creators. Only public profile names and pictures.
Show 4 child fieldsHide child fields
idcrtr_…namestringinitialsstringavatarUrlstringnullable
namestringtypeenumorganicpaid_adsstatusenumdraftopenpausedclosedarchivedvisibilityenuminvite: creators the brand invites; network: any creator can find it and apply.
invitenetworkbriefstringnullableWhat creators read before applying.
platformsenum[]instagramtiktokpaidSocialPlatformsenum[]instagramtiktokallowManualOrganicUploadbooleanallowPaidPromotionbooleanallowPaidSocialUploadsbooleanrequireAdAuthorizationbooleanCreators grant an ad authorization (a Meta partnership; on TikTok, their account approved to your Business Center) before their work runs as a creator-identity ad.
submissionLimitsobjectShow 4 child fieldsHide child fields
modeenumlimitedunlimitedmaxnumberconcurrentModeenumlimitedunlimitedconcurrentMaxnumber
payobjectWhat creators earn. A creator reading the program sees their own pay, with any terms the brand set for them.
Show 5 child fieldsHide child fields
rulesobject[]baseintegerGuaranteed each period, in cents.
capintegernullableThe most one creator is paid per period, in cents; null or left out for no cap.
scheduleobjectapprovalenumautomatic pays each period on its own; manual waits for the brand to approve the calculated amount.
automaticmanual
paySummarystringThe pay in plain English, ready to show.
payVersionintegerThe pay's version, bumped by each pay edit. Admitted creators move to it on their next action in the program; each application shows the version it's on.
payIssuesobject[]Ways the program's pay can't be paid as set, for the brand to fix; it keeps paying as it does until then. Empty when there are none, and on programs seen on the network.
Show 3 child fieldsHide child fields
codeenumpay_invalid_valuepay_cap_zeropay_cap_below_amountpay_cap_requiredpay_base_needs_periodpay_schedule_mismatchpay_duplicate_rulepay_scope_invalidpay_exceeds_budgetpay_primary_missingpay_primary_changedpay_program_unsupportedpathstringmessagestring
promotedobjectShow 4 child fieldsHide child fields
typeenumnullableappofferotherproductsitenamestringnullableurlstringnullableproductsprod_…[]Catalog products, first one primary.
briefFilesobject[]Show 6 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablepreviewobjectnullableShow 3 child fieldsHide child fields
urlstringcontentTypestringnullablesizenumbernullable
referenceVideosobject[]Show 7 child fieldsHide child fields
filefile_…fileNamestringcontentTypestringsizenumberurlstringnullablewidthnumbernullableheightnumbernullable
agreementsany[]The agreements applying accepts: each one's current version.
submissionAgreementsany[]The agreements submitting work to the program accepts.
currencystringLowercase ISO 4217 code, e.g. usd.
budgetobjectnullableThe brand's own numbers; null on programs seen on the network.
Show 1 child fieldHide child fields
amountnumbernullableThe planned budget.
adSpendobjectnullableShow 2 child fieldsHide child fields
totalnumberbyPlatformobject[]Show 2 child fieldsHide child fields
platformstringamountnumber
partnerApprovalobjectnullableShow 3 child fieldsHide child fields
statusenumdraftpendingapprovedrejectedchanges_requestedlaunchednotestringnullablerequestedAtstringnullable
createdByPartneracct_…nullablestartsAtstringnullableendsAtstringnullableversionintegerSend it back on PATCH to reject edits based on a stale read.
createdAtstringupdatedAtstring