• Documentation
  • Introduction
    • The member journey
  • Training
    • Create a program
    • Courses and sections
    • Lessons, media and publication
    • Milestones and paths
    • Tasks and deliverables
    • Cohorts and groups
  • Student & Community
    • Joining a school
    • Learning and resuming
    • Submitting and revising work
    • Calendar and lives
    • Spaces and questions
    • Reading progress
  • Coaching
    • Roles and assignments
    • Member context and work queue
    • Reviews and feedback
    • Sessions and interventions
    • Cohort cockpit and live operations
  • Leads & Qualification
    • People, leads and applications
    • Contacts and import
    • Qualification forms
    • Application triage
  • Setting & Booking
    • Setter scope
    • Sales availability
    • Share a booking link
    • Prospect booking
    • Agenda and booking management
    • Prepare a call and share its meeting link
  • Closing, Offers & Payments
    • Closer scope
    • Compose an offer
    • Share a nominal payment link
    • Buyer checkout and access
    • Instalments
    • Offline payment
    • Track payment and access failures
    • Stripe school account
  • Administration & Integrations
    • Organization roles and domains
    • API keys and tenant binding
    • Webhooks
    • Payment setup
  • API quickstart
  • API reference
    • Connect with MCP
    • Enrollments
      • GETGet the enrollment timeline
      • GETGet the coaching briefing
      • POSTPause an enrollment
      • POSTResume an enrollment
      • POSTExtend a deadline
      • POSTTransfer an enrollment
      • POSTClose an enrollment
      • POSTSubmit an outcome measure
      • GETList outcome measures
      • GETList deadline extensions
      • DELETECancel a deadline extension
      • GETList enrollments
      • POSTEnroll a person
    • Cohorts
      • GETGet the cohort cockpit
      • GETList the enrollments behind a cockpit signal
      • PATCHConfigure a cohort
      • POSTMove a cohort to another phase
      • POSTCreate a cohort
      • POSTChange a cohort's status
    • Coaching sessions
      • GETList coaching sessions
      • GETGet a coaching session
      • POSTRecord a coaching session
      • POSTAppend coaching session entries
    • Interventions
      • GETList interventions
      • POSTPlan an intervention
      • POSTClose an intervention
    • Live sessions
      • PATCHRecord live attendance
      • GETList live attendance
      • GETRead one enrollment's attendance
      • GETList live sessions
      • POSTSchedule a live session
      • PATCHUpdate a live session
      • POSTCancel a live session
      • GETGet live session
    • Programs
      • GETList programs
      • POSTCreate a program
      • GETRead a program
      • PATCHUpdate a program
      • POSTArchive a program
      • POSTRestore a program
    • Courses
      • GETList the courses of a program
      • POSTCreate a course
      • PATCHUpdate a course
      • POSTRename a course
      • POSTArchive a course
      • POSTReorder the courses of a program
      • POSTUpload a course cover
    • Sections
      • GETList the sections of a course
      • POSTCreate a section
      • POSTRename a section
      • POSTDissolve a section
      • POSTReorder the sections of a course
      • POSTMove a lesson into a section
      • DELETETake a lesson out of its section
    • Lessons
      • GETList the lessons of a program
      • POSTCreate a lesson
      • GETRead a lesson
      • PATCHUpdate a lesson
      • POSTPublish a lesson
      • POSTArchive a lesson
      • POSTMove a lesson to another course
      • POSTReorder the lessons of a program
      • POSTAttach a resource
      • DELETEDetach a resource
      • POSTReorder the resources of a lesson
      • POSTUpload a lesson resource
      • POSTUpload a lesson video
      • GETRead a lesson by its identifier
      • PATCHUpdate a lesson by its identifier
      • GETRead the discussion of a lesson
      • POSTComment on a lesson
    • Milestones
      • GETList the milestones of a program
      • POSTCreate a milestone
      • PATCHUpdate a milestone
      • POSTArchive a milestone
      • POSTReorder the milestones of a program
      • GETList the contributions of a milestone
      • POSTAttach a contribution
      • DELETEDetach a contribution
    • People
      • POSTImport people
      • POSTLink a duplicate person
      • DELETEUnlink a duplicate person
    • Delivery analytics
      • GETGet delivery analytics
    • Sales availability
      • GETRead sales availability
      • GETPreview sales slots
      • PUTReplace sales availability
      • GETList eligible sales closers
    • Community
      • POSTUpload an attachment
      • POSTAttach to a thread
      • POSTCreate a space
      • POSTPost a thread
      • POSTReply to a thread
      • POSTLink a thread
      • GETList spaces
      • GETRead a thread
      • GETSearch the community
    • Offer payments
      • POSTPause automatic charging
      • DELETEResume automatic charging
      • POSTCharge an instalment now
      • GETGet collections dashboard
    • Member tasks
      • POSTCreate a member task
      • GETList the tasks of a milestone
      • PUTUpdate a member task
      • POSTArchive a member task
      • POSTReorder the tasks of a milestone
      • GETRead a task
      • GETList program tasks
    • Deliverables
      • POSTCreate a deliverable
      • GETList the deliverables of a task
      • GETGet a deliverable
      • PUTUpdate a deliverable
      • POSTArchive a deliverable
    • Groups
      • GETList groups
      • POSTCreate a group
      • GETGet a group
      • PATCHUpdate a group
      • POSTAdd a Group membership
      • DELETERemove a Group membership
    • Paths
      • GETList program paths
      • POSTCreate a path
      • GETGet a path
      • PATCHVersion or promote a path
    • Webhooks
      • GETList webhook subscriptions
      • POSTCreate a webhook subscription
      • GETGet a webhook subscription
      • PATCHUpdate a webhook subscription
      • DELETEDelete a webhook subscription
      • POSTVerify a webhook subscription
      • POSTRotate a webhook secret
      • POSTPause or reactivate a webhook subscription
      • GETList webhook deliveries
      • GETGet a webhook delivery
      • POSTReplay a webhook delivery
    • Media
      • GETList media
      • POSTUpload a media
      • PATCHRename a media
      • DELETEDelete a media
    • Bookings
      • GETList the open slots of a booking link
      • POSTSave a booking lead
      • POSTBook a call for a prospect
      • GETGet booking details
      • GETList bookings
      • GETGet booking
      • PATCHUpdate booking details
      • GETGet booking agenda
      • GETGet closer meeting link
      • GETList person bookings
      • PUTSet closer meeting link
      • GETList booking links
      • POSTSend a booking email
      • GETRead booking follow-up
      • POSTCreate booking link
      • GETGet booking link
      • PUTRecord booking attendance
      • GETRead booking reminder settings
      • PATCHUpdate booking link
      • POSTReschedule booking
      • PUTSet booking reminder settings
      • POSTCancel booking
      • GETList booking reassignment candidates
      • POSTReassign booking
      • GETList booking reschedule slots
      • GETList booking reassignment slots
    • My learning
      • GETList my enrollments
      • GETGet my learning context
      • GETList my lessons
      • GETGet one of my lessons
      • GETList my agenda
      • GETGet my lesson note
      • PUTSave my lesson note
      • DELETEDelete my lesson note
      • GETList my lesson notes
      • GETGet my lesson's agent section
      • GETList my tasks
      • GETRead my submission
      • POSTOpen my submission draft
      • PUTSave my submission draft
      • POSTSubmit my work
      • POSTResubmit my work
    • Forms
      • GETList forms
      • POSTCreate a form
      • GETGet a form
      • PATCHUpdate form identity
      • DELETEDelete a form
      • PUTSave form definition
      • PUTSet form theme
      • PUTSet form qualification
      • PUTSet submission mode
      • PUTOpen or close a form
      • POSTPublish a form
      • POSTUnpublish a form
      • GETList form responses
      • GETGet a form response
      • GETRead form statistics
      • POSTRetry response qualification
      • GETRead form definition
      • GETRead form theme
      • GETRead form qualification
      • GETRead form submission-settings
      • GETRead form identity fields
      • PUTSet form identity fields
    • Calendar connections
      • GETList calendar connections
      • GETRead a calendar connection
      • POSTRequest calendar consent
      • GETList writable calendars
      • PUTSelect a calendar
      • DELETEDisconnect a calendar
    • Offers
      • GETList offers
      • POSTCreate an offer
      • GETGet an offer
      • PATCHUpdate an offer
      • GETGet composer options
    • Responsibilities
      • GETList responsibilities
      • POSTAssign a responsibility
      • DELETERemove a responsibility
    • Submission reviews
      • GETList submission reviews
      • GETRead a submission review
      • POSTTake a submission in review
      • POSTDecide a submission review
    • Closers
      • GETList closer invitations
      • POSTInvite a closer
      • POSTResend a closer invitation
      • DELETECancel a closer invitation
      • GETRead commercial responsibility
      • PUTAssign commercial responsibility
      • GETRead my sales availability
      • PUTUpdate my sales availability
      • GETRead my closer setup
    • Personal preparation
      • GETRead my work profile
      • PATCHUpdate my work profile
      • GETRead my preparation
    • Video library
      • GETList video resources
      • GETGet a video resource
      • POSTPublish a video resource
      • PATCHUpdate a video resource
      • POSTUnpublish a video resource
      • POSTRepublish a video resource
    • Video questions
      • POSTAsk a question
      • GETList my questions
      • GETGet my question
      • GETList received questions
      • PATCHAssign a question
      • POSTAnswer a question
      • POSTCancel a question
  1. Documentation
  2. API reference
  3. Offers
  4. Create an offer
HomeBlogDocumentationPricingContact

Create an offer

PreviousList offersNextGet an offer
On this page
AuthorizationOrganization roleBusiness authorizationRequest headersRequest bodyExampleResponseResponse fieldsExample responseNotesRelatedMonthly split payment rules

POST /api/v1/offers

Amounts use EUR or USD minor units without conversion. The school is derived from your API key.

Authorization

Use x-api-key with an active key bound to this school. The bearer must retain membership and current domain permissions; CASL remains authoritative for owner/admin operations.

Organization role

Role in the organizationThis endpoint
OWNERAllowed
ADMINAllowed
MEMBERConditional — organization-scoped closer

Business authorization

RequirementRule for this endpoint
Business roleOrganization-scoped closer for members; none beyond owner/admin otherwise
Resource scopeSchool bound to the key; closer reads only their own offers, without schedules
ParticipationNone
Resource stateNo additional state requirement

Request headers

HeaderRequiredDescription
x-api-keyyesSchool API key
Idempotency-KeyyesStable key for this intention and target
X-Correlation-IdnoSupport correlation identifier

Request body

FieldTypeRequiredNullableDescription
currencyEUR or USDnonoCreation defaults to EUR; update preserves the current currency when omitted.
amountCentsintegerUSD: yesEUR: yesPositive minor units, maximum 1000000000; EUR may inherit the selected program price. USD never inherits or compares against that EUR price.
titlestringnoyesUp to 120 characters.
recipientNamestringnoyesUp to 120 characters; a name or email makes the offer nominative.
recipientEmailemailnoyesRecipient email; empty string clears it.
programId, cohortIdUUIDnoyesBoth must belong to this school.
paymentModeupfront or installmentsyesnoInstalments require a named recipient.
installmentsarrayyesnoMaximum 36 items: position non-negative integer, dueOn YYYY-MM-DD, amountCents positive integer at most 1000000000. All amounts use the offer currency. Upfront clears the schedule.
conditionsstringnoyesUp to 2000 characters.
paymentMethodModeschool-default, buyer-choice or fixednonoDefaults to school-default.
preferredPaymentMethodCodestringfixed: yesyesActive payment method from composer options; maximum 64 characters.
landingpresentation or direct-paymentyesnoPublic landing behavior.
slugstringnoyesMaximum 120 lowercase letters, digits and single hyphens; ignored for named offers.
seatLimitintegernoyes1 to 100000; nominative offers have one seat.
expiresAtISO 8601 instantnoyesInclude timezone, for example 2027-01-01T00:00:00Z.
publishbooleanyesnoOpens the offer and locks currency. The schedule must cover the amount; instalment fees may increase its total.

Example

bash
curl -X POST "$COHORTE_API_BASE_URL/api/v1/offers" \
  -H "x-api-key: $COHORTE_API_KEY" \
  -H "Idempotency-Key: offer-usd-001" \
  -H "Content-Type: application/json" \
  -d '{"title":"Coaching","currency":"USD","amountCents":25000,"paymentMode":"upfront","installments":[],"landing":"presentation","publish":false}'

Response

  • 200: successful read, update or replay.
  • 201: created.
  • 400: invalid payload, unsupported currency, locked currency or invalid offer state.
  • 401: invalid key, bearer or membership.
  • 403: insufficient permission.
  • 429: rate limited.
  • 500: unexpected error.

Response fields

FieldTypeNullableDescription
successbooleannoTrue on success
dataobjectnoOffer editable fields above, plus id, status, soldCount, programDefaultPriceCents (null for USD), expiresAt and updatedAt ISO instants. Schedule items also carry id; installments is null for a restricted closer read. paymentPath is the private payment path for nominative offers, null for slug offers.

Example response

json
{"success":true,"data":{"id":"44444444-4444-4444-8444-444444444444","title":"Coaching","amountCents":25000,"currency":"USD","status":"draft","installments":[],"programDefaultPriceCents":null}}

Notes

Keep the same idempotency key for retries; a successful retry returns the existing offer without another mutation. Do not reuse a key for another target or intention. Changes are audited and emit offer events. Creation with a recipient email also resolves their contact. No payment or email is sent by this command. Currency locks at publication, even before the first sale.

Related

  • Create an offer
  • Get an offer
  • Update an offer

Monthly split payment rules

Publishing a split offer requires 2–36 equal positive monthly amounts, with a total at least equal to the upfront price. A higher total is a commercial surcharge. Dates describe relative monthly periods; the actual calendar starts at purchase. A new split purchase requires a usable connected Stripe account. Stripe creates its Product and Price automatically and collects exactly N periods.

An active Checkout reservation or Stripe payment plan refuses local offer/schedule edits. Existing API-key tenant binding, CASL and business scope apply unchanged. Upfront offers retain one-time Checkout.