Skip to content

Auction Lifecycle Configuration API

This guide documents the v2 REST contract for auction policies, presets, program preset assignment, lifecycle arming, and automated lifecycle triggers.

Audience: frontend engineers integrating the company and superadmin consoles.

Related docs:


Conventions

All endpoints require:

Authorization: Bearer <access-token>
Content-Type: application/json

All successful responses use the standard envelope:

{
  "status": "success",
  "code": 200,
  "data": {},
  "message": "Operation completed successfully.",
  "error": null
}

Company scope is always derived from auth or path context. Do not send companyId in request bodies.


Config Layer Contract

The same nullable patch contract is used by platform policy, company policy, auction presets, and program defaults. Auction instances support only the ordinary setting fields; they do not accept trigger, preset, or security overrides.

Field Type Values / notes
hasPrebid boolean or null Enables prebid flow.
auctionBidMode string or null DISCOUNT_INCREASING, TOTAL_VALUE_DECREASING.
auctionClosingMode string or null DURATION_MODE, CALL_MODE.
auctionDurationSeconds integer or null Minimum 1 when set.
auctionExtensionSeconds integer or null Minimum 0 when set.
auctionFirstCallSeconds integer or null First-call timing for call mode.
auctionSecondCallSeconds integer or null Second-call timing for call mode.
auctionThirdCallSeconds integer or null Third-call timing for call mode.
subscriberJoinGraceSeconds integer or null Live auction join grace window.
subscriberJoinLeadSeconds integer or null Seconds before auction start when joining opens.
allowStaffOfflineBids boolean or null Allows staff-entered floor/offline bids.
prebidMutabilityPolicy string or null IMMUTABLE_CANCEL_ONLY, MUTABLE_UNTIL_CLOSE.
auctionJoiningRule string or null BEFORE_START, GRACE_PERIOD, ANYTIME.
autoStart boolean or null Auto-start trigger flag.
approvalRequired boolean or null Staff-approval gate before the auction can start.
autoOpenPrebid boolean or null Auto-open prebid trigger flag.
autoRevealPrebids boolean or null Auto-reveal prebid amounts after end.
autoDeclareWinner boolean or null Auto-declare winner when eligible.

Patch semantics:

  • Omitted field: leave the stored override unchanged.
  • null: clear this layer's override and inherit from the next lower layer.

Resolved precedence is intentionally different by concern:

settings:       default < platform < company < preset < program < auction
trigger policy: default < platform < company < preset < program
securities:     program only (otherwise the default empty whitelist)

Trigger provenance can therefore never be auction. allowedSecurities is stored only on Program.


Platform Policy

Platform policy is global and superadmin-only.

Method Endpoint
GET /v2/admin/platform-auction-policy
PUT /v2/admin/platform-auction-policy

GET platform policy

GET /v2/admin/platform-auction-policy

Response data:

{
  "hasPrebid": false,
  "auctionBidMode": "TOTAL_VALUE_DECREASING",
  "auctionClosingMode": "DURATION_MODE",
  "auctionDurationSeconds": 1800,
  "auctionExtensionSeconds": 60,
  "auctionFirstCallSeconds": 15,
  "auctionSecondCallSeconds": 15,
  "auctionThirdCallSeconds": 15,
  "subscriberJoinGraceSeconds": 0,
  "subscriberJoinLeadSeconds": 600,
  "allowStaffOfflineBids": true,
  "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
  "auctionJoiningRule": "BEFORE_START",
  "autoStart": false,
  "approvalRequired": false,
  "autoOpenPrebid": false,
  "autoRevealPrebids": false,
  "autoDeclareWinner": false,
  "createdAt": "2026-08-13T09:00:00.000Z",
  "updatedAt": "2026-08-13T09:00:00.000Z"
}

If no row exists yet, nullable config keys are returned as null, and timestamps are null.

PUT platform policy

PUT /v2/admin/platform-auction-policy

Body: any subset of the config layer contract.

{
  "hasPrebid": true,
  "auctionDurationSeconds": 1800,
  "auctionExtensionSeconds": 120,
  "auctionJoiningRule": "BEFORE_START",
  "autoOpenPrebid": true,
  "autoRevealPrebids": true,
  "autoDeclareWinner": false
}

Response data: same shape as GET. The update writes an auction config audit log in the same transaction.


Company Policy

Company policy is one row per company.

Method Endpoint Role
GET /v2/companies/company-auction-policy COMPANY
PUT /v2/companies/company-auction-policy COMPANY
GET /v2/admin/companies/:companyId/company-auction-policy SUPERADMIN
PUT /v2/admin/companies/:companyId/company-auction-policy SUPERADMIN

GET company policy

GET /v2/companies/company-auction-policy
GET /v2/admin/companies/:companyId/company-auction-policy

Response data:

{
  "companyId": "company-id",
  "hasPrebid": true,
  "auctionBidMode": null,
  "auctionClosingMode": null,
  "auctionDurationSeconds": 1800,
  "auctionExtensionSeconds": null,
  "auctionFirstCallSeconds": null,
  "auctionSecondCallSeconds": null,
  "auctionThirdCallSeconds": null,
  "subscriberJoinGraceSeconds": null,
  "allowStaffOfflineBids": null,
  "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
  "auctionJoiningRule": "BEFORE_START",
  "autoStart": null,
  "approvalRequired": null,
  "autoOpenPrebid": true,
  "autoRevealPrebids": true,
  "autoDeclareWinner": false,
  "createdAt": "2026-08-13T09:00:00.000Z",
  "updatedAt": "2026-08-13T09:00:00.000Z"
}

PUT company policy

PUT /v2/companies/company-auction-policy
PUT /v2/admin/companies/:companyId/company-auction-policy

Body: any subset of the config layer contract.

{
  "auctionDurationSeconds": 2700,
  "autoDeclareWinner": null
}

Response data: same shape as GET. The update writes an auction config audit log in the same transaction.


Resolved Company Policy

Reads the effective auction settings a new program created by this company would inherit, folding the cascade default < platform < company (no preset, program, or auction layer). A company key with no stored override falls back to the platform policy, and anything still unset falls back to the server default. Use it to prefill the auction setup step before a program/draft exists.

Method Endpoint Role
GET /v2/companies/company-auction-policy/resolved COMPANY
GET /v2/admin/companies/:companyId/company-auction-policy/resolved SUPERADMIN

GET resolved company policy

GET /v2/companies/company-auction-policy/resolved
GET /v2/admin/companies/:companyId/company-auction-policy/resolved

Response data — the effective settings/triggerPolicy/allowedSecurities plus provenance, which maps every resolved key to the layer that supplied it (default, platform, or company):

{
  "companyId": "company-id",
  "settings": {
    "hasPrebid": true,
    "auctionBidMode": "TOTAL_VALUE_DECREASING",
    "auctionClosingMode": "DURATION_MODE",
    "auctionDurationSeconds": 1800,
    "auctionExtensionSeconds": 120,
    "auctionFirstCallSeconds": 15,
    "auctionSecondCallSeconds": 15,
    "auctionThirdCallSeconds": 15,
    "subscriberJoinGraceSeconds": 0,
    "allowStaffOfflineBids": true,
    "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
    "auctionJoiningRule": "BEFORE_START"
  },
  "allowedSecurities": [],
  "triggerPolicy": {
    "autoStart": false,
    "approvalRequired": false,
    "autoOpenPrebid": false,
    "autoRevealPrebids": false,
    "autoDeclareWinner": false
  },
  "provenance": {
    "hasPrebid": "company",
    "auctionBidMode": "default",
    "auctionClosingMode": "default",
    "auctionDurationSeconds": "company",
    "auctionExtensionSeconds": "platform",
    "auctionFirstCallSeconds": "default",
    "auctionSecondCallSeconds": "default",
    "auctionThirdCallSeconds": "default",
    "subscriberJoinGraceSeconds": "default",
    "allowStaffOfflineBids": "default",
    "prebidMutabilityPolicy": "default",
    "auctionJoiningRule": "default",
    "allowedSecurities": "default",
    "autoStart": "default",
    "approvalRequired": "default",
    "autoOpenPrebid": "default",
    "autoRevealPrebids": "default",
    "autoDeclareWinner": "default"
  }
}

A company that has never set a policy simply receives the platform/default values. A missing company reads as 404.


Auction Presets

Presets are named config layers. Platform presets have companyId: null. Company presets are owned by one company.

Company users can list platform presets plus their own company presets. Company users can mutate only their own company presets.

Endpoint matrix

Method Endpoint Role Scope
GET /v2/admin/auction-presets SUPERADMIN platform presets only
POST /v2/admin/auction-presets SUPERADMIN create platform preset
GET /v2/admin/auction-presets/:presetId SUPERADMIN get any readable preset by id
PUT /v2/admin/auction-presets/:presetId SUPERADMIN update preset
DELETE /v2/admin/auction-presets/:presetId SUPERADMIN delete preset
GET /v2/companies/auction-presets COMPANY platform + own company presets
POST /v2/companies/auction-presets COMPANY create own company preset
GET /v2/companies/auction-presets/:presetId COMPANY platform + own company preset
PUT /v2/companies/auction-presets/:presetId COMPANY own company preset only
DELETE /v2/companies/auction-presets/:presetId COMPANY own company preset only
GET /v2/admin/companies/:companyId/auction-presets SUPERADMIN platform + company presets
POST /v2/admin/companies/:companyId/auction-presets SUPERADMIN create company preset
GET /v2/admin/companies/:companyId/auction-presets/:presetId SUPERADMIN platform + company preset
PUT /v2/admin/companies/:companyId/auction-presets/:presetId SUPERADMIN update company preset
DELETE /v2/admin/companies/:companyId/auction-presets/:presetId SUPERADMIN delete company preset

List presets

GET /v2/companies/auction-presets?pageNumber=1&pageSize=10
GET /v2/admin/auction-presets?pageNumber=1&pageSize=10
GET /v2/admin/companies/:companyId/auction-presets?pageNumber=1&pageSize=10

Query params:

Param Type Default / notes
pageNumber number Standard pagination, minimum 1.
pageSize number Standard pagination, maximum 100.

Response data:

{
  "count": 2,
  "pageNumber": 1,
  "pageSize": 10,
  "totalPages": 1,
  "hasPreviousPage": false,
  "hasNextPage": false,
  "auctionPresets": [
    {
      "id": "preset-id",
      "companyId": null,
      "slug": "standard-live-auction",
      "name": "Standard live auction",
      "description": "Conservative live auction defaults for manually controlled cycles.",
      "isPlatformPreset": true,
      "hasPrebid": false,
      "auctionBidMode": "TOTAL_VALUE_DECREASING",
      "auctionClosingMode": "DURATION_MODE",
      "auctionDurationSeconds": 1800,
      "auctionExtensionSeconds": 60,
      "auctionFirstCallSeconds": 15,
      "auctionSecondCallSeconds": 15,
      "auctionThirdCallSeconds": 15,
      "subscriberJoinGraceSeconds": 0,
      "allowStaffOfflineBids": true,
      "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
      "auctionJoiningRule": "BEFORE_START",
      "autoStart": false,
      "approvalRequired": false,
      "autoOpenPrebid": false,
      "autoRevealPrebids": false,
      "autoDeclareWinner": false,
      "createdAt": "2026-08-13T09:00:00.000Z",
      "updatedAt": "2026-08-13T09:00:00.000Z"
    }
  ]
}

Create preset

POST /v2/companies/auction-presets
POST /v2/admin/auction-presets
POST /v2/admin/companies/:companyId/auction-presets

Body:

Field Type Required Notes
name string yes 1-150 chars.
slug string no 1-80 chars. If omitted, backend derives it from name.
description string or null no Max 2000 chars.
config layer fields mixed no Any config layer field from this document.

Example:

{
  "name": "Prebid with automated review",
  "slug": "prebid-auto-review",
  "description": "Prebid-enabled flow that opens prebids and reveals amounts after auto end.",
  "hasPrebid": true,
  "auctionDurationSeconds": 1800,
  "auctionExtensionSeconds": 120,
  "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
  "autoOpenPrebid": true,
  "autoRevealPrebids": true,
  "autoDeclareWinner": false
}

Response data: one preset object.

Get preset

GET /v2/companies/auction-presets/:presetId
GET /v2/admin/auction-presets/:presetId
GET /v2/admin/companies/:companyId/auction-presets/:presetId

Response data: one preset object.

Update preset

PUT /v2/companies/auction-presets/:presetId
PUT /v2/admin/auction-presets/:presetId
PUT /v2/admin/companies/:companyId/auction-presets/:presetId

Body: any subset of name, description, and config layer fields.

{
  "name": "Prebid with automated reveal",
  "description": "Use after prebid launch.",
  "autoDeclareWinner": true,
  "auctionExtensionSeconds": null
}

slug is immutable after create.

Response data: updated preset object. The update writes an auction config audit log in the same transaction.

Delete preset

DELETE /v2/companies/auction-presets/:presetId
DELETE /v2/admin/auction-presets/:presetId
DELETE /v2/admin/companies/:companyId/auction-presets/:presetId

Response data:

{
  "presetId": "preset-id"
}

Deletion is blocked while programs still reference the preset. Auction snapshots retain the preset id as immutable audit data and do not hold a database relation to the preset.


Program Preset Assignment

Programs assign a default preset through their existing step/update contracts. This is the public contract that backs Program.auctionPresetId.

Endpoints

Flow Endpoint Role
New program step 2 POST /v2/companies/programs/new/:programId/steps/2 COMPANY
New program step 2 by admin POST /v2/admin/programs/new/:programId/steps/2 SUPERADMIN
Existing program step 2 POST /v2/companies/programs/existing/:programId/steps/2 COMPANY
Existing program step 2 by admin POST /v2/admin/programs/existing/:programId/steps/2 SUPERADMIN
Company program update PATCH /v2/companies/me/programs/:programId COMPANY
Admin program update PATCH /v2/admin/programs/:programId SUPERADMIN

Assignment field

Field Type Semantics
auctionPresetId string or null, optional String assigns a preset, null clears it, omitted leaves it unchanged.

Rules:

  • The program bid must be AUCTION or AUCTION_AND_LOT.
  • A company user can assign platform presets or presets owned by the same company.
  • A superadmin assigning for a company can assign platform presets or presets owned by that company.
  • Another company's preset id returns the same safe not-found behavior as a missing preset.
  • If a program is changed away from auction bidding, the backend clears auctionPresetId.

Step 2 also accepts the five trigger flags from the config layer contract (autoStart, approvalRequired, autoOpenPrebid, autoRevealPrebids, autoDeclareWinner) so a program can be born with its automated lifecycle configured. An absent flag is left unset (inherit from the preset/company/platform layer); a prebid-only flag enabled while hasPrebid: false is rejected with 400. They are stored on the program row itself, not the preset, and behave exactly like the same keys on the PATCH /programs/:programId/settings endpoint.

New program step 2 example

POST /v2/companies/programs/new/:programId/steps/2
{
  "foremanCommission": "5.5",
  "delayFineAmount": "1200",
  "bid": "AUCTION",
  "hasFirstCycleAuction": true,
  "hasPrebid": true,
  "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
  "prebidDocumentRequired": false,
  "auctionPresetId": "preset-id",
  "description": "Auction-backed program",
  "auctionDurationSeconds": 1800,
  "auctionJoiningRule": "BEFORE_START",
  "allowedSecurities": ["GOLD_ORNAMENTS"],
  "autoStart": true,
  "autoOpenPrebid": false,
  "autoRevealPrebids": false,
  "autoDeclareWinner": false,
  "acceptedTermsAndConditions": true
}

Admin step 2 uses the same body except acceptedTermsAndConditions is omitted.

Response data:

{
  "programId": "program-id"
}

Existing program step 2 example

POST /v2/companies/programs/existing/:programId/steps/2
{
  "foremanCommission": "4.5",
  "delayFineAmount": "1200",
  "bid": "AUCTION_AND_LOT",
  "hasPrebid": true,
  "prebidMutabilityPolicy": "IMMUTABLE_CANCEL_ONLY",
  "prebidDocumentRequired": false,
  "completedCycles": 5,
  "auctionPresetId": "preset-id",
  "description": "Imported auction-backed program",
  "autoStart": false,
  "autoOpenPrebid": true,
  "autoRevealPrebids": true,
  "autoDeclareWinner": false,
  "acceptedTermsAndConditions": true
}

Admin step 2 uses the same body except acceptedTermsAndConditions is omitted.

Response data includes the program step result used by existing program creation.

Program update examples

Assign:

PATCH /v2/companies/me/programs/:programId
PATCH /v2/admin/programs/:programId
{
  "auctionPresetId": "preset-id"
}

Clear:

{
  "auctionPresetId": null
}

Assign while updating defaults:

{
  "bid": "AUCTION",
  "hasPrebid": true,
  "auctionPresetId": "preset-id",
  "auctionDurationSeconds": 2700,
  "auctionJoiningRule": "GRACE_PERIOD"
}

Update the automated trigger flags (same semantics as step 2 creation and the PATCH /programs/:programId/settings endpoint — omitted leaves the stored flag untouched, null clears it, and a prebid-only flag is rejected with 400 while hasPrebid resolves to false):

{
  "autoStart": true,
  "autoOpenPrebid": false,
  "autoRevealPrebids": true,
  "autoDeclareWinner": null
}

Response data:

{
  "programId": "program-id"
}

Program assignment and trigger-flag edits write the existing UPDATE_AUCTION_SETTINGS action log.


Program Default Auction Settings

Reads the effective default auction settings a program's future auctions would inherit before any auction-specific override. Resolves the cascade default < platform < company < preset < program and reports the origin of every key.

Endpoint Role
GET /v2/companies/programs/:programId/settings COMPANY
PATCH /v2/companies/programs/:programId/settings COMPANY
GET /v2/admin/programs/:programId/settings SUPERADMIN
PATCH /v2/admin/programs/:programId/settings SUPERADMIN

The company endpoint is scoped to the caller's tenant: a program owned by another company reads as not found.

Example

GET /v2/companies/programs/:programId/settings

Response data:

{
  "programId": "program-id",
  "programName": "Monthly Chit",
  "presetId": "preset-id",
  "prebidDocumentRequired": true,
  "prebidDocument": {
    "templateId": "template-id",
    "templateKey": "chit-prebid",
    "templateName": "Prebid Form",
    "templateDescription": null,
    "templateVersionId": "version-id",
    "templateVersion": 1,
    "fileName": "prebid.pdf",
    "fields": [
      {
        "fieldKey": "amount",
        "label": "Bid Amount",
        "fieldType": "CURRENCY_AMOUNT",
        "required": true,
        "maxLength": null,
        "sortOrder": 1
      },
      {
        "fieldKey": "signature",
        "label": "Signature",
        "fieldType": "SIGNATURE_IMAGE",
        "required": true,
        "maxLength": null,
        "sortOrder": 2
      }
    ]
  },
  "settings": {
    "hasPrebid": true,
    "auctionBidMode": "TOTAL_VALUE_DECREASING",
    "auctionClosingMode": "DURATION_MODE",
    "auctionDurationSeconds": 1800,
    "auctionExtensionSeconds": 60,
    "auctionFirstCallSeconds": 15,
    "auctionSecondCallSeconds": 15,
    "auctionThirdCallSeconds": 15,
    "subscriberJoinGraceSeconds": 0,
    "allowStaffOfflineBids": true,
    "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
    "auctionJoiningRule": "BEFORE_START"
  },
  "allowedSecurities": ["GOLD_ORNAMENTS"],
  "triggerPolicy": {
    "autoStart": true,
    "approvalRequired": false,
    "autoOpenPrebid": false,
    "autoRevealPrebids": false,
    "autoDeclareWinner": false
  },
  "provenance": {
    "hasPrebid": "program",
    "auctionBidMode": "default",
    "auctionClosingMode": "default",
    "auctionDurationSeconds": "program",
    "auctionExtensionSeconds": "default",
    "auctionFirstCallSeconds": "default",
    "auctionSecondCallSeconds": "default",
    "auctionThirdCallSeconds": "default",
    "subscriberJoinGraceSeconds": "default",
    "allowStaffOfflineBids": "default",
    "prebidMutabilityPolicy": "default",
    "auctionJoiningRule": "default",
    "allowedSecurities": "program",
    "autoStart": "company",
    "approvalRequired": "default",
    "autoOpenPrebid": "default",
    "autoRevealPrebids": "default",
    "autoDeclareWinner": "default"
  }
}

provenance maps every resolved key to the layer that supplied it (default, platform, company, preset, or program). presetId is the effective assigned preset — a foreign company's preset is ignored and reported as null. prebidDocumentRequired reflects whether the program demands a signed prebid document; when it does, prebidDocument carries the configured prebid document template (the same shape the subscriber prebid form endpoint serves) and is null otherwise.

PATCH default auction settings

Modifies the program's own override layer — the keys returned under settings, allowedSecurities, and triggerPolicy — plus the prebid document fields. The same config-layer patch contract is used:

  • Omitted field: leave the stored program override unchanged.
  • null: clear this layer's override (inherit from the next lower layer).
  • allowedSecurities: a whitelist; set to [] to clear it so all security types are permitted again.
  • prebidDocumentRequired: boolean — require a signed prebid document from subscribers.
  • prebidDocumentTemplateVersionId: string or null — pin the prebid document template version the program uses; null clears the pin so the default PREBID template is used.
PATCH /v2/companies/programs/:programId/settings
PATCH /v2/admin/programs/:programId/settings

Example — shorten the prebid window and enable auto-start:

{
  "auctionThirdCallSeconds": 8,
  "autoStart": true,
  "allowedSecurities": ["GOLD_ORNAMENTS", "SILVER_COINS"]
}

Example — require a signed prebid document using a pinned template:

{
  "prebidDocumentRequired": true,
  "prebidDocumentTemplateVersionId": "template-version-id"
}

Clear it again:

{
  "prebidDocumentRequired": false,
  "prebidDocumentTemplateVersionId": null
}

Behavior:

  • companyId is derived from the request, never the body. A company caller may only PATCH programs owned by its tenant; another tenant's program id reads as 404.
  • allowedSecurities codes are validated against existing security types; an unknown code returns 400.
  • A non-null prebidDocumentTemplateVersionId must reference a published, active PREBID template owned by the program's company; a missing, foreign, or unpublished template reads as 404/400.
  • Direct same-layer trigger contradictions are rejected (for example autoOpenPrebid: true with hasPrebid: false). Inherited autoOpenPrebid/autoRevealPrebids values may remain configured but are dormant while the effective hasPrebid is false. autoDeclareWinner remains valid without prebid.
  • An empty body (no fields) returns the current resolved settings unchanged.
  • The update writes an UPDATE_PROGRAM_AUCTION_SETTINGS audit log (scope: PROGRAM, targetId: programId) in the same transaction.
  • Already-armed auctions keep their frozen snapshot; the new defaults apply from the next schedule, approval, or cycle activation that re-arms the lifecycle.

Response data: the same resolved shape as GET — the freshly resolved effective settings, allowedSecurities, triggerPolicy, provenance, and presetId.

200 OK
{
  "status": "success",
  "code": 200,
  "data": {
    "programId": "program-id",
    "presetId": "preset-id",
    "settings": { "hasPrebid": true, "...": "updated defaults" },
    "allowedSecurities": ["GOLD_ORNAMENTS", "SILVER_COINS"],
    "triggerPolicy": {
      "autoStart": true,
      "approvalRequired": false,
      "autoOpenPrebid": false,
      "...": false
    },
    "provenance": {
      "autoStart": "program",
      "allowedSecurities": "program",
      "...": "default"
    }
  },
  "message": "Program default auction settings updated successfully.",
  "error": null
}

Lifecycle Arming APIs

Staff auction lifecycle operations are auction-scoped.

Action Company endpoint Admin endpoint
Schedule live auction PATCH /v2/companies/auctions/:auctionId/schedule PATCH /v2/admin/auctions/:auctionId/schedule
Approve auction POST /v2/companies/auctions/:auctionId/approve POST /v2/admin/auctions/:auctionId/approve
Reveal prebids POST /v2/companies/auctions/:auctionId/prebids/reveal POST /v2/admin/auctions/:auctionId/prebids/reveal

Schedule live auction

PATCH /v2/companies/auctions/:auctionId/schedule
PATCH /v2/admin/auctions/:auctionId/schedule

Body:

{
  "auctionStartAt": "2026-08-20T09:00:00.000Z",
  "auctionDurationSeconds": 1800,
  "reason": "Cycle 3 auction",
  "auctionBidMode": "TOTAL_VALUE_DECREASING",
  "auctionClosingMode": "DURATION_MODE",
  "auctionExtensionSeconds": 120,
  "auctionFirstCallSeconds": 30,
  "auctionSecondCallSeconds": 20,
  "auctionThirdCallSeconds": 10,
  "subscriberJoinGraceSeconds": 0,
  "allowStaffOfflineBids": true,
  "prebidMutabilityPolicy": "MUTABLE_UNTIL_CLOSE",
  "auctionJoiningRule": "BEFORE_START"
}

Response data includes:

{
  "auctionId": "auction-id",
  "cycleId": "cycle-id",
  "stateVersion": 2,
  "status": "SCHEDULED",
  "prebidStartAt": null,
  "prebidEndAt": "2026-08-19T18:29:59.999Z",
  "auctionStartAt": "2026-08-20T09:00:00.000Z",
  "auctionDurationSeconds": 1800,
  "auctionEndAt": "2026-08-20T09:30:00.000Z",
  "prebidPhase": "OPEN"
}

Scheduling re-arms the auction config snapshot and schedules any enabled prebid-open automation.

Approve auction

POST /v2/companies/auctions/:auctionId/approve
POST /v2/admin/auctions/:auctionId/approve

Body (optional):

{
  "reason": "Prebid review passed"
}

Moves an approval-required auction from SCHEDULED to READY; the approve endpoint rejects auctions whose resolved policy has approvalRequired disabled. Approval is orthogonal to how the auction later starts (manual WebSocket start or scheduled auto-start): both paths require READY when approvalRequired is enabled, and start directly from SCHEDULED otherwise. Approving re-arms the lifecycle so nextTransitionAt is aligned with the approved status.

Manual live start remains WebSocket-only: auction.status.update with { "status": "START" }.

Response data:

{
  "auctionId": "auction-id",
  "cycleId": "cycle-id",
  "status": "READY",
  "approvalRequired": true,
  "auctionStartAt": "2026-08-20T09:00:00.000Z"
}

Reveal prebid amounts

POST /v2/companies/auctions/:auctionId/prebids/reveal
POST /v2/admin/auctions/:auctionId/prebids/reveal

Body:

{
  "reason": "Auction completed"
}

Only valid after auctionStatus = ENDED and when prebid is enabled. The command is idempotent after first reveal.

Response data:

{
  "auctionId": "auction-id",
  "cycleId": "cycle-id",
  "stateVersion": 4
}

Snapshots And Automation

When an auction is armed, the server freezes resolved config into the auction row.

Field Meaning
configVersion Monotonic revision identifying the frozen effective configuration.
configSnapshot Versioned resolved settings, securities, triggers, provenance, preset id, arm trigger, and timestamp.
armedAt Timestamp of the latest arm/re-arm.

The same transaction stores the resolved nextTransitionAt. There are no per-auction delayed jobs or stale-version job parameters.

configSnapshot.schemaVersion identifies the snapshot format; it is independent of configVersion. Runtime locks, detail/list reads, bidding and joining rules, scheduled transitions all read the complete valid snapshot first. Unarmed and legacy rows fall back to the auction/program columns and then server defaults. Missing, malformed, legacy, or unsupported snapshots never enable automation; malformed trigger policy disables every automated trigger.

Automation is controlled by the frozen trigger policy in configSnapshot. autoOpenPrebid and autoRevealPrebids are dormant when the frozen settings.hasPrebid is false.

Trigger When it runs Effect
autoOpenPrebid Armed auction with a pending prebid window Persists an immediate open transition.
autoStart Armed auction whose policy opts in (approval gate satisfied) Persists start at the applicable start/close time.
autoRevealPrebids Ended prebid auction Persists an immediate prebid reveal transition.
autoDeclareWinner Ended auction after reveal is no longer blocking Persists an immediate declaration transition.

The automatic start transition exists only while the auction is SCHEDULED or READY with an auctionStartAt. When approvalRequired is enabled, it is persisted only from READY — the approve command re-arms it; while approvalRequired is disabled it is armed directly from SCHEDULED.

Pause clears nextTransitionAt; resume recomputes the deadline transactionally. Per-auction delayed jobs normally execute transitions at their deadlines. The 30-second reconciler queries due timestamps, so missed enqueue operations and overdue work are automatically rediscovered after a worker or Redis failure.

Policy and preset edits are audited, but already armed auctions continue to use their frozen snapshot until a later schedule, approval, or cycle activation re-arms them.


Seeded Defaults

The common seeder creates missing baseline records without overwriting existing production edits:

  • platform auction policy row with id platform
  • platform preset standard-live-auction
  • platform preset prebid-auto-review
  • platform preset call-mode-staff-led

These presets are selectable by all companies because their companyId is null.


Development Migration Reset

The auction-policy migrations were squashed before production release. Existing development and test databases created from the earlier migration sequence must be reset and migrated from zero; do not attempt to preserve those unreleased auction-policy rows. For a local database, run the Prisma migrate reset command with the appropriate development env file, then run the normal seed flow.


Removed APIs

Do not integrate new clients with the removed cycle-scoped staff lifecycle URLs:

PATCH /v2/companies/cycles/:cycleId/auction/schedule
PATCH /v2/admin/cycles/:cycleId/auction/schedule
POST /v2/companies/cycles/:cycleId/auction/live-decision
POST /v2/admin/cycles/:cycleId/auction/live-decision
POST /v2/companies/cycles/:cycleId/auction/prebids/reveal
POST /v2/admin/cycles/:cycleId/auction/prebids/reveal

The auction-scoped live-decision endpoints are also removed:

POST /v2/companies/auctions/:auctionId/live-decision
POST /v2/admin/auctions/:auctionId/live-decision

Use the auction-scoped URLs under /v2/companies/auctions/:auctionId/... and /v2/admin/auctions/:auctionId/... instead — notably POST .../approve for the approval gate.