Reference

Every field, what it accepts, and the responses to expect.

Fields

POST /api/business/v1/sourcings · PATCH /api/business/v1/sourcings/:id
FieldTypeRequiredAccepts
Request
namestringRequired1–120 characters. Exact duplicate payloads return 409 duplicate_sourcing with the existing ID.
start_datedate | nullOptionalYYYY-MM-DD, in your organization's timezone. Future dates create pending requests; null starts immediately.
deadlinedateRequiredDelivery deadline, YYYY-MM-DD. On or after the start date and not in the past.
groupsarrayRequired for grouped requests1–20 groups, at most 200 price buckets in total. Groups are alternatives; one card must not ambiguously fit multiple buckets.
duplicate_limitsarrayOptionalUp to 30 copy limits across the entire request. Empty means no copy cap.
duplicate_limits[].scopeenumRequired per limitcard, character or athlete.
duplicate_limits[].max_copiesintegerRequired per limit1–10,000. Choose an exact maximum, not a range.
duplicate_limits[].subjectsstring[]OptionalOmit to apply to every entity. Character/athlete names or real Card Ladder card IDs, never certificates or invented IDs.
Groups
groups[].namestringRequired1–80 characters. A readable name for this selection.
groups[].filtersobjectRequiredEvery specified condition must match. Values within a list are alternatives.
groups[].bandsarrayRequired1–30 inclusive price ranges per group. Use 0–100 then 101–200 to avoid overlapping boundaries.
Filters · groups[].filters
categoriesenum[]RequiredPokemon, OnePiece, Baseball, Basketball, Football.
card_formatenumOptionalgraded (default), raw (ungraded), or either. With either, grader, grade and certificate filters apply only to graded cards. Raw-only groups cannot have grading filters.
gradersenum[]OptionalPSA, BGS, CGC, SGC. Omit for any supported grader.
grader_rulesobject[] | nullOptionalSeparate grade rules sharing the same price buckets and budgets. Example: [{"grader":"BGS","grade_min":7},{"grader":"PSA","grade_min":1,"grade_max":5}]. A card must match one rule; unlisted graders are excluded. One rule per grader. Omit shared graders, grades, grade_min and grade_max when using this field.
grader_rules[].grader / grades / grade_min / grade_maxenum / number[] / number | nullgrader requiredPSA, BGS (Beckett), CGC or SGC. Grades are 1–10 in half-grade steps: use exact grades, an inclusive range or a minimum. Omitted grade restrictions accept any grade from that grader. Raw-only groups cannot use these rules.
gradesnumber[]OptionalExact grades from 1 to 10 in half-grade steps. If a range is also present, both must match.
grade_min / grade_maxnumber | nullOptionalInclusive lowest/highest grade, 1–10.
languagesenum[]OptionalEnglish, Japanese, Chinese, Korean, French, German, Italian, Spanish, Portuguese, Dutch, Indonesian, Thai, Russian, Polish. Defaults still exclude Chinese Pokémon.
cert_number_mininteger | nullOptionalInclusive numeric certificate floor, e.g. 70,000,000. An unknown or nonnumeric certificate cannot satisfy it.
year_min / year_maxinteger | nullOptionalInclusive printing years, 1800–2100.
playersstring[] | nullOptionalCharacter or athlete names. At least one must match whole words in the recorded player field.
keywordsstring[] | nullOptionalAt least one phrase must match whole words in the card label, set or variation.
exclude_keywordsstring[] | nullOptionalSkip cards matching any phrase. For example: Gengar, Leaf, NCAA.
allow_qualifiedbooleanOptionalFalse by default. Whether grading qualifiers/condition notes are accepted.
notesstring | nullOptionalUp to 2,000 characters of plain-English buying instructions for this group. For example: "We don't want cards from sets released between 2020 and 2026, inclusive. Avoid Rayquaza cards with a low graded population; confirm the population cutoff with us before sourcing them." Notes stay visible with the request but do not automatically apply filters. Encode supported restrictions in structured filters too; other conditions need review.
exclusionsarrayOptionalConditional exclusions. All conditions in one active exclusion must match to reject a card.
exclusions[]objectConditionallabel, active (default true), categories, year_min, year_max, card_types (rookie/prospect), value_above (USD dollars). At least one condition is required.
Price buckets · groups[].bands[]
value_minnumberRequiredLowest Card Ladder green value in USD dollars, inclusive, with at most two decimal places. 0–100,000,000. Preserve exact cents, such as 50.01.
value_maxnumber | nullRequiredHighest Card Ladder green value in USD dollars, inclusive, with at most two decimal places and at least value_min. null means no maximum.
budgetinteger | nullRequiredBudget for this bucket in whole USD dollars. null means unlimited. The request total is calculated from all bucket budgets; one unlimited bucket makes the total unlimited.
min_confidenceintegerRequiredEvery integer from 0 to 5 is valid. 2 means 2/5 or above (2, 3, 4, 5), excluding missing scores. 1, 3, 4 and 5 work the same way. 0 accepts any score, including missing scores.
exclude_keywordsstring[]OptionalAdditional exclusions only for this price range.
allocation_idUUIDEdits onlyKeep the ID from GET for retained buckets. Omit for new ones. Removed buckets are archived; acquired cards and confirmed pickups remain under their original allocation and count toward the campaign budget.
Updates
expected_updated_attimestampRequired for PATCHCopy updated_at from the latest GET exactly. A stale revision returns 409 sourcing_changed. Pending/paused requests only; pause active requests before editing.

Defaults

Chinese Pokémon and WNBA are excluded. Pokémon and One Piece must be official TCG products. We use Card Ladder green value; account pricing applies automatically. Notes remain visible for the sourcing team and do not replace structured filters.

Endpoints

POST /sourcingsCreate a request. Future start dates make it pending.
GET /sourcings?view=allRequests, notes, allocation criteria, budgets and progress. view=home/history/all; status accepts active,paused,canceled,delivered. Follow next_offset.
GET /sourcings/:idThe request, all its buckets and one page of acquired cards. Optional bucket_id, allocation_id and offset. Acquisition-time prices and scan links are included.
PATCH /sourcings/:idReplace pending/paused configuration with revision protection. Existing acquisition facts stay fixed.
POST /sourcings/:id/cancelDelete a zero-acquired request from Sourcing. It remains in History as canceled.
POST /sourcings/:id/pause or /resumeChange sourcing status.
GET /acquisitionsPage acquired cards across requests. Filter by sourcing_id, allocation_id and local from/to dates.
GET /acquisitions/:id/previewPrivate WebP scan preview, at most 480 × 640. Use for card grids with the same session or Bearer authorization. ETag caching is supported.
GET /acquisitions/:id/photoA short-lived link to the full scanner photo. Fetch only when the user opens the image.
GET /sourcings/:id/templateReusable rules with fresh dates and review notes.
GET /summaryAuthoritative cumulative/period totals. Supply both from and to for a local-date range.
GET /memoriesRemembered buying preferences: revision, pending learning jobs and active preferences with category, statement and origin.
POST /memories · PATCH /memories/:id · DELETE /memories/:idAdd {category, statement}, rewrite {statement, category?} or forget a preference. Budgets and dates are never remembered.

All paths use /api/business/v1. Date bounds are inclusive local YYYY-MM-DD dates. On request lists, from/to filter creation dates; history_from/history_to filter the finished period.

Status codes

Errors keep the same shape: error (code), message, status, optional issues (path + message), and sourcing_id for duplicates.

StatusCodeWhat to do
200SuccessThe response contains the created/updated request, list, cards, or action result. Exact duplicate creation returns 409 instead.
400invalid_jsonSend a valid JSON object with Content-Type: application/json.
401unauthorized / invalid_keyThe API key is absent, invalid or revoked. Use Authorization: Bearer <key>.
403not_authorized / admin_requiredThe member or role cannot perform this action. Account administration requires an admin dashboard session.
404not_foundNo matching record is available to this organization.
409duplicate_sourcingThe exact request already exists. Read sourcing_id from the response; do not create another copy.
409sourcing_changedSomeone edited the request. GET it again and use its new updated_at.
409sourcing_activePause active sourcing before changing its budget, filters or notes.
409funded_sourcingAcquired dollars are greater than zero. Pause instead of deleting/canceling.
409sourcing_finished / historical_sourcingFinished or imported historical records cannot be edited. Reuse their rules in a new request.
422invalid_inputA field is missing/invalid or buckets overlap. issues contains each field path and message.
422budget_below_acquiredKeep total and bucket budgets at least as large as their acquired amounts.
422deadline_in_pastChoose a delivery deadline today or later in the organization's timezone.
429rate_limitedWait before trying again.
503unavailableThe service is temporarily unavailable. Check whether the write succeeded before retrying.