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:
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¶
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¶
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¶
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¶
Body: any subset of the config layer contract.
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:
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
bidmust beAUCTIONorAUCTION_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¶
{
"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:
Existing program step 2 example¶
{
"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:
Clear:
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:
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¶
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 ornull— pin the prebid document template version the program uses;nullclears the pin so the default PREBID template is used.
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:
Clear it again:
Behavior:
companyIdis derived from the request, never the body. A company caller may only PATCH programs owned by its tenant; another tenant's program id reads as404.allowedSecuritiescodes are validated against existing security types; an unknown code returns400.- A non-null
prebidDocumentTemplateVersionIdmust reference a published, active PREBID template owned by the program's company; a missing, foreign, or unpublished template reads as404/400. - Direct same-layer trigger contradictions are rejected (for example
autoOpenPrebid: truewithhasPrebid: false). InheritedautoOpenPrebid/autoRevealPrebidsvalues may remain configured but are dormant while the effectivehasPrebidis false.autoDeclareWinnerremains valid without prebid. - An empty body (no fields) returns the current resolved settings unchanged.
- The update writes an
UPDATE_PROGRAM_AUCTION_SETTINGSaudit 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.
{
"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¶
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¶
Body (optional):
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:
Only valid after auctionStatus = ENDED and when prebid is enabled. The command is idempotent after first reveal.
Response data:
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.