Request and Response Contract#

Unified Request Envelope#

All draw calls use Draw::execute(array $request).

<?php
$result = $draw->execute([
    'method' => '...',
    'items' => [...],
    'candidates' => [...],
    'sourceFile' => '...',
    'options' => [...],
]);

Field Reference#

  • method (required): one of supported method names.

  • items (required except campaign.batch): method-specific payload.

  • candidates (required for grand and campaign.*): user IDs.

  • sourceFile (optional for grand): CSV alternative to candidates.

  • options (optional): method options.

Method-to-Required-Field Map#

  • lucky: items

  • flexible item methods: items

  • grand: items + (candidates or sourceFile)

  • campaign.run: items + candidates

  • campaign.batch: candidates + options.phases

  • campaign.simulate: items + candidates

Method Option Matrix#

lucky
  • options.count (default 1)

  • options.check (default true)

Flexible item methods
  • options.count (default 1)

  • options.check (default true)

  • options.withReplacement (batched only, default false)

grand
  • options.retryCount (compatibility metadata; pool-based logic is used)

campaign.run
  • options.rules

  • options.seed

  • options.cachePool

  • options.eligibility

  • options.auditSecret

  • options.withExplain (default false)

  • options.retryLimit (compatibility metadata)

campaign.batch
  • options.phases (required)

  • options.rules

  • options.seed

  • options.cachePool

  • options.eligibility

  • options.auditSecret

  • options.withExplain

  • options.retryLimit (compatibility metadata)

campaign.simulate
  • options.iterations (default 1000)

  • options.seed (default 0)

  • options.retryLimit (compatibility metadata)

Unified Response Envelope#

Every method returns:

<?php
[
    'method' => '...',
    'entries' => [
        [
            'itemId' => ?string,
            'candidateId' => ?string,
            'value' => mixed,
            'meta' => array,
        ],
    ],
    'raw' => mixed,
    'meta' => [
        'mode' => 'single|multi',
        'requestedCount' => int,
        'returnedCount' => int,
        'fulfilled' => bool,
        'partialReason' => ?string,
        'unfilledCount' => int,
        // method-specific extra metadata may be present
    ],
]

Meta Semantics#

  • requestedCount: requested slots/picks

  • returnedCount: produced entries

  • fulfilled: true when request is fully satisfied

  • partialReason: explanation when not fulfilled

  • unfilledCount: remaining slots not returned

Common partialReason values:

  • insufficient_unique_candidates

  • no_eligible_candidates

  • unfulfilled

raw Payload by Method Family#

lucky and flexible item methods

Usually list-like method output values.

grand

array<string, list<string>> keyed by item ID.

campaign.run

winners, slotPlan, optional explain, partialReason, audit.

campaign.batch

phases, partialReason, audit.

campaign.simulate

iterations, totalSlots, userDistribution, itemDistribution.