Create an upload
Submit a list of phone numbers. Use multipart/form-data to upload a
CSV file (max 100 MB), or application/json to send phone numbers
directly. Either way, the upload requires at least 100 valid US/CA
phone numbers and at most 250,000.
Map a name column to enable OptimalDial Identity, which additionally judges whether each number belongs to the contact named on that row. Identity does not change what an upload costs.
Authorizations
OptimalDial API key, prefixed od_live_, sent as Authorization: Bearer ....
Mint keys in the in-app developer panel; they are scoped to a single organization.
Body
CSV file (≤100 MB, must include a header row).
Name of the column containing phone numbers.
Validation tier. standard charges 1 credit/contact; max is more thorough and charges 1.5 credits/contact (billed as ceil(valid_count × 1.5)).
standard, max Override the file's original name.
Enables OptimalDial Identity. Name of the column holding the contact's full name. Supply this OR both first_name_column and last_name_column.
Enables OptimalDial Identity when supplied together with last_name_column. Supplying only one half returns 400.
Enables OptimalDial Identity when supplied together with first_name_column. Supplying only one half returns 400.
Response
Upload created, credits charged, ready for processing.
cancelled is a legacy value retained so historical uploads still
parse — no new upload can enter it.
pending_mapping, validating, validation_failed, awaiting_confirmation, ready_for_processing, processing, completed, failed, cancelled Credits returned to the organization when OptimalDial refunds an upload.
web for in-app uploads, api for direct /api/v1/uploads calls,
api_pool for uploads synthesized from the Contacts API.
web, api, api_pool, null Validation tier used for this upload (standard or max).
standard, max, null Whether OptimalDial Identity was requested for this upload, i.e. a name column was mapped at creation.
Distribution of the results, populated once status == "completed". Lets you see the shape of a list without downloading it.
How many times these results have been downloaded, counting both the web app and this API.
true once the processed file can be downloaded. Storage keys are deliberately not exposed — use the download endpoints.
true once the deprecated download/processed-filtered endpoint will succeed, whether from a stored file or generated on demand.