Resolve Merchants API
Merchant-scoped operations for managing sub-merchant resources. The merchant document upload endpoint creates a document record and starts transfer into Resolve-managed storage for validation.
Merchant-scoped operations for managing sub-merchant resources. The merchant document upload endpoint creates a document record and starts transfer into Resolve-managed storage for validation.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/resolve-merchants-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.2.0
info:
title: Resolve API Reference Access Keys Merchants API
version: V5
description: 'API Support: [accounts@resolvepay.com](mailto:accounts@resolvepay.com?subject=API)
Legacy (v2) API documentation: [https://app.resolvepay.com/docs/api/v2](https://app.resolvepay.com/docs/api/v2)
'
servers:
- url: https://app-sandbox.resolvepay.com/api
description: Sandbox server
security:
- bearerAuth: []
- basicAuth: []
tags:
- name: Merchants
x-displayName: Merchants
description: 'Merchant-scoped operations for managing sub-merchant resources.
The merchant document upload endpoint creates a document record and starts transfer into Resolve-managed storage for validation.
'
paths:
/merchants:
get:
summary: List Merchants
operationId: listMerchants
description: 'Returns sub-merchants under the authenticated partner account.
Supported query options:
- Pagination: `limit`, `page`
- Text search: `search`
- Sorting: `sort`
- Field filters: `filter[field][eq]=value`
Supported filter fields:
- `id`
- `external_id`
- `name`
- `legal_name`
- `email`
- `underwriting_status`
- `created_at`
Supported sort fields:
- `created_at`
- `id`
- `name`
- `legal_name`
Use `-` prefix for descending sort, for example `sort=-name`.
'
parameters:
- name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 100
default: 25
description: Maximum number of merchants to return.
example: 25
- name: page
in: query
schema:
type: integer
minimum: 1
default: 1
description: Page number for paginated merchant results.
example: 1
- name: search
in: query
schema:
type: string
description: Case-insensitive text search across merchant `id`, `name`, `email`, and `legal_name`.
example: alpha
- name: sort
in: query
schema:
type: string
enum:
- created_at
- -created_at
- id
- -id
- name
- -name
- legal_name
- -legal_name
description: 'Sort field for merchant results.
Prefix with `-` for descending order.
'
example: -created_at
- name: filter
explode: true
style: deepObject
schema:
type: object
properties:
id:
type: object
properties:
eq:
type: string
external_id:
type: object
properties:
eq:
type: string
name:
type: object
properties:
eq:
type: string
legal_name:
type: object
properties:
eq:
type: string
email:
type: object
properties:
eq:
type: string
format: email
underwriting_status:
type: object
properties:
eq:
type: string
description: Current latest underwriting status for the merchant.
created_at:
type: object
properties:
eq:
type: string
format: date-time
in: query
description: 'Filter merchants by allowlisted fields.
Filter semantics: `filter[field][operator]=value`.
Supported filters:
- `filter[id][eq]=mrc_1234567890abcdef`
- `filter[legal_name][eq]=Alpha Supply LLC`
- `filter[underwriting_status][eq]=pending`
- `filter[created_at][eq]=2026-03-11T00:00:00.000Z`
'
responses:
'200':
$ref: '#/components/responses/MerchantListResponse'
'400':
$ref: '#/components/responses/InvalidRequestOrValidationResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'429':
$ref: '#/components/responses/RateLimitResponse'
tags:
- Merchants
post:
summary: Create Merchant
operationId: createMerchant
description: 'Creates a sub-merchant under the authenticated partner and starts underwriting lifecycle tracking.
For the **partner API** contract, `id` is server-managed and is not accepted in the request payload.
Resolve derives/assigns the merchant identifier from merchant naming inputs (`dba_name` or `legal_business_name`) with random alphanumeric fallback for collisions.
Core merchant validation includes:
- `business_phone` must be a valid US phone number
- `formation_state` must map to a valid US state
- US business addresses validate `state` and `postal_code`
- beneficial owner US addresses validate `state` and `postal_code`
- `authorized_signer.phone`, when provided, must be a valid US phone number
- `ein` must be a valid EIN format
- banking fields validate account-number shape and ABA routing number format
- `bank_account_number` must be different from `bank_routing_number`
This endpoint also supports optional inline document URL ingestion. If document arrays are provided
(`bank_statements`, `financial_statements`, `credit_references`, `personal_guarantee`, `other_documents`),
Resolve queues `download_url` ingestion jobs equivalent to the document endpoint.
Inline document requests require:
- `filename` with an extension
- supported `filetype` for the merchant underwriting document profile
- `download_url` using `http` or `https`
- matching filename extension and `filetype`
Merchant creation is not rolled back for inline document ingestion failures.
Inline download dispatch is performed after database commit. Dispatch failures are surfaced per-item in
`document_ingestion.results`, and the affected merchant document/file metadata is marked failed even though
the merchant and some/all document rows were already persisted.
'
requestBody:
$ref: '#/components/requestBodies/CreateMerchantRequest'
responses:
'200':
$ref: '#/components/responses/MerchantResponse'
'400':
$ref: '#/components/responses/InvalidRequestOrValidationResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'429':
$ref: '#/components/responses/RateLimitResponse'
tags:
- Merchants
/merchants/{merchant_id}:
get:
summary: Get Merchant
operationId: getMerchant
description: 'Retrieves a single sub-merchant belonging to the authenticated partner.
Only merchants scoped to the authenticated partner are returned. Requests for
unknown merchants or merchants outside that scope return `404`.
This path currently overlaps with a legacy public merchant endpoint. To avoid
ambiguous response shapes or fallback behavior, send the `resolve-api-version`
header on every request. Use `resolve-api-version: partner-v1` when you need
the partner API response contract documented here.
'
parameters:
- name: merchant_id
in: path
schema:
type: string
required: true
description: ID of the sub-merchant under your partner account.
example: mrc_1234567890abcdef
responses:
'200':
$ref: '#/components/responses/MerchantResponse'
'400':
$ref: '#/components/responses/InvalidRequestOrValidationResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'429':
$ref: '#/components/responses/RateLimitResponse'
tags:
- Merchants
put:
summary: Update Merchant
operationId: updateMerchant
description: 'Updates a sub-merchant belonging to the authenticated partner.
For the **partner API** contract, `id` is immutable and cannot be updated via request payload.
Post-underwriting restrictions apply once the latest underwriting decision has been finalized.
Fields that are **not updateable** after underwriting is complete:
- `legal_business_name`
- `business_address`
- `business_email`
- `business_phone`
- `entity_type`
- `formation_state`
- `ein`
- `annual_revenue`
- `years_in_business`
- `industry`
- `authorized_signer`
- `bank_account_number`
- `bank_routing_number`
- `beneficial_owners` (existing owners are not editable)
Fields that are **updateable** after underwriting is complete:
- `dba_name`
- `business_description`
- `website`
- `estimated_monthly_net_terms_volume`
- `existing_net_terms_info`
- `metadata`
- `plaid_access_token`
- `additional_beneficial_owners` (add-only)
Validation for mutable request fields follows the same partner create rules for phone, EIN, US address fields,
beneficial owner address fields, authorized signer phone, and banking inputs.
This endpoint also supports optional inline document URL ingestion using the same `download_url` pattern as
merchant create. If document arrays are provided (`bank_statements`, `financial_statements`,
`credit_references`, `personal_guarantee`, `other_documents`), Resolve queues `download_url` ingestion jobs
equivalent to the document endpoint.
Merchant updates are not rolled back for inline document ingestion failures. Dispatch failures are surfaced
per-item in `document_ingestion.results`, and the affected merchant document/file metadata is marked failed.
'
parameters:
- name: merchant_id
in: path
schema:
type: string
required: true
description: ID of the sub-merchant under your partner account.
example: mrc_1234567890abcdef
requestBody:
$ref: '#/components/requestBodies/UpdateMerchantRequest'
responses:
'200':
$ref: '#/components/responses/MerchantResponse'
'400':
$ref: '#/components/responses/InvalidRequestOrValidationResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'429':
$ref: '#/components/responses/RateLimitResponse'
tags:
- Merchants
/merchants/{merchant_id}/documents:
get:
summary: List Merchant Documents
operationId: listMerchantDocuments
description: 'Returns document presence and validation lifecycle status for a specific sub-merchant.
This endpoint is metadata-only and does not return file bodies or signed retrieval URLs.
Supported query options:
- Pagination: `limit`, `page`
- Sorting: `sort`
- Field filters: `filter[field][eq]=value`
Supported filter fields:
- `document_type`
- `status`
Supported sort fields:
- `created_at`
Use `-` prefix for descending sort, for example `sort=-created_at`.
'
parameters:
- name: merchant_id
in: path
schema:
type: string
required: true
description: ID of the sub-merchant under your partner account.
example: mrc_1234567890abcdef
- name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 100
default: 25
description: Maximum number of document records to return.
example: 25
- name: page
in: query
schema:
type: integer
minimum: 1
default: 1
description: Page number for paginated document results.
example: 1
- name: sort
in: query
schema:
type: string
enum:
- created_at
- -created_at
description: 'Sort field for merchant document results.
Prefix with `-` for descending order.
'
example: -created_at
- name: filter
explode: true
style: deepObject
schema:
type: object
properties:
document_type:
type: object
properties:
eq:
type: string
status:
type: object
properties:
eq:
type: string
enum:
- pending_upload
- uploaded_pending_validation
- accepted
- rejected
- failed
in: query
description: 'Filter merchant documents by type or validation status.
Filter semantics: `filter[field][operator]=value`.
Supported filters:
- `filter[document_type][eq]=bank_statements`
- `filter[status][eq]=accepted`
'
responses:
'200':
$ref: '#/components/responses/MerchantDocumentListResponse'
'400':
$ref: '#/components/responses/InvalidRequestOrValidationResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'429':
$ref: '#/components/responses/RateLimitResponse'
tags:
- Merchants
post:
summary: Create a Merchant Document Upload Request
operationId: createMerchantDocumentUploadRequest
description: 'Creates a new merchant document record for a sub-merchant and initializes document transfer to the Resolve document validation service.
The transfer method is determined by request shape:
- If `download_url` is provided, Resolve queues a background download job (`transfer_method=download_url`).
- Otherwise, Resolve returns a presigned S3 upload URL (`transfer_method=presigned_upload`).
The validation profile is endpoint-managed by Resolve and cannot be overridden in the request.
Request validation includes:
- `filename` must include an extension
- `filetype` must be a supported MIME type for the merchant underwriting document profile
- `download_url`, when provided, must use `http` or `https`
- `filename` extension must match `filetype`
For `download_url`, queue dispatch is executed after database commit. A dispatch failure at that stage does not
roll back the merchant document row; instead, the response remains successful and the document is marked failed.
'
parameters:
- name: merchant_id
in: path
schema:
type: string
required: true
description: ID of the sub-merchant under your partner account.
example: mrc_1234567890abcdef
requestBody:
$ref: '#/components/requestBodies/CreateMerchantDocumentRequest'
responses:
'200':
$ref: '#/components/responses/CreateMerchantDocumentResponse'
'400':
$ref: '#/components/responses/InvalidRequestOrValidationResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'429':
$ref: '#/components/responses/RateLimitResponse'
tags:
- Merchants
components:
schemas:
UpdateMerchantRequest:
type: object
description: 'All fields are optional for update requests.
For merchants whose latest underwriting decision has been finalized, updates to core legal/identity/banking
fields may be blocked.
'
properties:
legal_business_name:
type: string
business_address:
$ref: '#/components/schemas/Address'
business_email:
type: string
format: email
business_phone:
type: string
description: Business phone number. Must be a valid US phone number and is normalized to E.164.
entity_type:
type: string
enum:
- corporation
- llc
- sole_proprietorship
- partnership
- non_profit
formation_state:
type: string
description: Business formation state. Must map to a valid US state and is normalized to the state code.
ein:
type: string
description: Employer Identification Number. Must be a valid EIN format.
dba_name:
type: string
annual_revenue:
type: integer
years_in_business:
type: integer
minimum: 0
industry:
type: string
business_description:
type: string
website:
type: string
format: uri
estimated_monthly_net_terms_volume:
type: integer
existing_net_terms_info:
type: object
additionalProperties: true
beneficial_owners:
type: array
description: Beneficial owner records. Existing owner records are not editable after underwriting is complete.
items:
$ref: '#/components/schemas/BeneficialOwner'
additional_beneficial_owners:
type: array
description: Add-only beneficial owner records for post-underwriting updates.
items:
$ref: '#/components/schemas/BeneficialOwner'
authorized_signer:
$ref: '#/components/schemas/AuthorizedSigner'
plaid_access_token:
type: string
description: Plaid access token for connected banking data.
bank_account_number:
type: string
description: Bank account number. Must satisfy Resolve account-number validation.
bank_routing_number:
type: string
description: ABA routing number. Must be a valid routing number.
metadata:
type: object
additionalProperties: true
bank_statements:
type: array
description: 'Optional document ingestion on merchant update.
Each item queues a background download job (equivalent to calling the document endpoint with `download_url`).
'
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
financial_statements:
type: array
description: Optional inline `financial_statements` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
credit_references:
type: array
description: Optional inline `credit_references` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
personal_guarantee:
type: array
description: Optional inline `personal_guarantee` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
other_documents:
type: array
description: Optional inline `other` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
RateLimitError:
type: object
title: Rate limit error
properties:
error:
type: object
properties:
message:
type: string
description: A short string, describing error details
example: Too many requests
type:
type: string
description: A short string, describing error type
enum:
- rate_limit_error
example: rate_limit_error
InlineDocumentDownloadRequest:
type: object
required:
- filename
- filetype
- download_url
properties:
filename:
type: string
description: 'Original filename for the remote file.
The filename must include an extension, and that extension must match `filetype`.
'
example: bank_statement_2026_01.pdf
filetype:
type: string
description: 'MIME type for the remote file.
Must be a supported MIME type for the merchant underwriting document validation profile.
'
example: application/pdf
download_url:
type: string
format: uri
description: Remote file URL. Only `http` and `https` URLs are accepted.
example: https://partner-files.example.com/bank_statement_2026_01.pdf
MerchantDocumentUploadRequestObject:
type: object
properties:
id:
type: string
description: Unique identifier of the merchant document.
example: md_1234567890abcdef
document_id:
type: string
description: Alias of the merchant document identifier.
example: md_1234567890abcdef
document_type:
type: string
enum:
- bank_statements
- financial_statements
- credit_references
- personal_guarantee
- other
example: bank_statements
status:
type: string
description: Initial validation lifecycle status for the document.
enum:
- pending_upload
- failed
example: pending_upload
upload_url:
type:
- string
- 'null'
format: uri
description: Presigned S3 URL to upload file content when `transfer_method` is `presigned_upload`.
example: https://resolve-document-validation-uploads-dev.s3.amazonaws.com/merchant/mrc_123/document/md_123/bank_statement_2026_01.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&...
upload_expires_at:
type:
- string
- 'null'
format: date-time
description: Expiration timestamp for `upload_url` when `transfer_method` is `presigned_upload`.
example: '2026-02-26T18:35:00.000Z'
object_key:
type: string
description: S3 object key where the document is expected to be stored.
example: merchant/mrc_123/document/md_1234567890abcdef/bank_statement_2026_01.pdf
transfer_method:
type: string
description: How the document is moved into Resolve-managed storage.
enum:
- presigned_upload
- download_url
example: presigned_upload
queue_dispatch_status:
type:
- string
- 'null'
description: 'Queue dispatch result when `transfer_method` is `download_url`.
'
enum:
- queued
- failed
example: queued
upload_headers:
type:
- object
- 'null'
description: 'Required headers to include on the presigned upload PUT request.
Always includes:
- `x-amz-meta-validation_profile`
May include callback routing headers when configured by Resolve:
- `x-amz-meta-callback_domain`
- `x-amz-meta-callback_url`
'
additionalProperties:
type: string
example:
x-amz-meta-validation_profile: merchant_underwriting_document_default
x-amz-meta-callback_domain: overcommunicative-unriotously-alaina.ngrok-free.dev
x-amz-meta-callback_url: https://overcommunicative-unriotously-alaina.ngrok-free.dev/api/internal/document-validation/completed
validation_profile:
type: string
description: Resolve-managed document validation profile applied to this request.
enum:
- merchant_underwriting_document_default
example: merchant_underwriting_document_default
MerchantList:
type: object
properties:
count:
type: integer
example: 2
page:
type: integer
example: 1
limit:
type: integer
example: 25
results:
type: array
items:
$ref: '#/components/schemas/Merchant'
InvalidRequestError:
type: object
title: Invalid request error
properties:
error:
type: object
properties:
message:
type: string
description: A short string, describing error details
example: '[Invalid request message]'
type:
type: string
description: A short string, describing error type
enum:
- invalid_request
example: invalid_request
CreateMerchantRequest:
type: object
required:
- legal_business_name
- business_address
- business_email
- business_phone
- entity_type
- formation_state
- ein
properties:
legal_business_name:
type: string
example: Acme Supply LLC
business_address:
$ref: '#/components/schemas/Address'
business_email:
type: string
format: email
example: ops@acmesupply.com
business_phone:
type: string
description: Business phone number. Must be a valid US phone number and is normalized to E.164.
example: '+15125550123'
entity_type:
type: string
enum:
- corporation
- llc
- sole_proprietorship
- partnership
- non_profit
example: llc
formation_state:
type: string
description: Business formation state. Must map to a valid US state and is normalized to the state code.
example: TX
ein:
type: string
description: Employer Identification Number. Must be a valid EIN format.
example: 12-3456789
dba_name:
type: string
example: Acme Industrial
annual_revenue:
type: integer
example: 4500000
years_in_business:
type: integer
minimum: 0
example: 6
industry:
type: string
example: Manufacturing
business_description:
type: string
example: Industrial hardware distributor
website:
type: string
format: uri
example: https://acmesupply.com
estimated_monthly_net_terms_volume:
type: integer
example: 350000
existing_net_terms_info:
type: object
additionalProperties: true
example:
provider: Internal
average_days_past_due: 12
beneficial_owners:
type: array
description: Initial beneficial owner list.
items:
$ref: '#/components/schemas/BeneficialOwner'
authorized_signer:
$ref: '#/components/schemas/AuthorizedSigner'
plaid_access_token:
type: string
description: Plaid access token when a bank connection has already been established.
example: access-sandbox-1234567890
bank_account_number:
type: string
description: 'Bank account number. Must satisfy Resolve account-number validation and must be different from
`bank_routing_number`.
'
example: '****6789'
bank_routing_number:
type: string
description: ABA routing number. Must be a valid routing number.
example: '*****021'
metadata:
type: object
additionalProperties: true
example:
partner_reference: mt-merchant-1029
bank_statements:
type: array
description: 'Optional document ingestion on merchant create.
Each item queues a background download job (equivalent to calling the document endpoint with `download_url`).
'
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
financial_statements:
type: array
description: Optional inline `financial_statements` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
credit_references:
type: array
description: Optional inline `credit_references` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
personal_guarantee:
type: array
description: Optional inline `personal_guarantee` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
other_documents:
type: array
description: Optional inline `other` document ingestion requests.
items:
$ref: '#/components/schemas/InlineDocumentDownloadRequest'
BeneficialOwner:
type: object
required:
- first_name
- last_name
- date_of_birth
- address
- ssn_last_4
properties:
first_name:
type: string
example: John
last_name:
type: string
example: Owner
date_of_birth:
type: string
format: date
example: '1987-04-14'
address:
$ref: '#/components/schemas/Address'
ssn_last_4:
type: string
minLength: 4
maxLength: 4
example: '1234'
ownership_percentage:
type: number
format: double
minimum: 0
maximum: 100
example: 35
DocumentIngestionSummary:
type: object
properties:
requested_count:
type: integer
example: 2
queued_count:
type: integer
example: 1
failed_count:
type: integer
example: 1
results:
type: array
items:
$ref: '#/components/schemas/DocumentIngestionResult'
CreateMerchantDocumentRequest:
type: object
required:
- document_type
- filename
- filetype
properties:
document_type:
type: string
description: Merchant document type.
enum:
- bank_statements
- financial_statements
- credit_references
- personal_guarantee
- other
example: bank_statements
filename:
type: string
description: 'Original filename for the document.
The filename must include an extension. For known MIME types, the extension must match `filetype`.
'
example: bank_statement_2026_01.pdf
filetype:
type: string
description: 'MIME type for the document.
Known MIME types are validated against the filename extension.
'
example: application/pdf
download_url:
type: string
format: uri
description: 'Optional remote URL for Resolve to fetch directly. When provided, Resolve queues a background download job
and does not return a presigned upload URL. Only `http` and `https` URLs are accepted.
'
example: https://partner-files.example.com/bank_statement_2026_01.pdf
MerchantDocument:
type: object
description: Merchant document metadata and validation lifecycle status.
properties:
id:
type: string
example: md_1234567890abcdef
merchant_id:
type: string
example: mrc_1234567890abcdef
document_type:
type: string
enum:
- bank_statements
- financial_statements
- credit_references
- personal
# --- truncated at 32 KB (54 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/resolve/refs/heads/main/openapi/resolve-merchants-api-openapi.yml