openapi: 3.0.3
info:
title: D&B Direct+ API
description: >-
D&B Direct+ is Dun & Bradstreet's RESTful API platform that exposes the
D&B Data Cloud — more than 500 million companies worldwide — for identity
resolution, search, enrichment, multi-process (match plus enrich), batch
processing, change monitoring, and historical research. All endpoints
return JSON, are versioned in the URI path, and require an OAuth 2.0
bearer token obtained from the /v3/token endpoint via client-credentials
grant. This profile is an OpenAPI sketch of the public surface based on
Dun & Bradstreet's published Direct+ documentation; the canonical
operation definitions live behind the gated developer portal at
https://directplus.documentation.dnb.com/.
version: '3.0'
contact:
name: D&B Direct+ Support
url: https://service.dnb.com/
termsOfService: https://www.dnb.com/utility-pages/terms-of-use.html
license:
name: Proprietary
url: https://www.dnb.com/utility-pages/terms-of-use.html
servers:
- url: https://plus.dnb.com
description: Production
tags:
- name: Authentication
description: OAuth 2.0 token issuance for Direct+.
- name: Identity Resolution
description: Match an input record to a D-U-N-S Number.
- name: Search
description: Find companies, principals, and related entities.
- name: Enrich
description: Retrieve Data Blocks for a known D-U-N-S Number.
- name: Multi-Process
description: Combined match plus enrich in a single call.
- name: Data File
description: Asynchronous batch file submission, status, and download.
- name: Monitoring
description: Subscribe to and consume change notifications on a portfolio.
- name: Research
description: Retrieve historical responses for audit and reconciliation.
paths:
/v3/token:
post:
tags:
- Authentication
summary: Generate Direct+ Access Token
description: >-
Exchange Direct+ API credentials for an OAuth 2.0 bearer access token
using the client-credentials grant. The returned token is included as
a Bearer authorization header on all subsequent Direct+ calls.
operationId: generateAccessToken
security:
- basicAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TokenRequest'
responses:
'200':
description: Access token issued.
content:
application/json:
schema:
$ref: '#/components/schemas/TokenResponse'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/match/cleanseMatch:
get:
tags:
- Identity Resolution
summary: Match Candidate To D-U-N-S Number
description: >-
Submit a candidate business record (name, address, registration
number, phone, email) and receive a ranked list of D-U-N-S Number
matches with match-grade, confidence-code, and quality indicators
suitable for auto-acceptance or manual review.
operationId: cleanseMatch
security:
- bearerAuth: []
parameters:
- name: name
in: query
required: true
schema: { type: string }
description: Business name as supplied by the caller.
- name: countryISOAlpha2Code
in: query
required: true
schema: { type: string, minLength: 2, maxLength: 2 }
description: ISO 3166-1 alpha-2 country code.
- name: streetAddressLine1
in: query
schema: { type: string }
- name: addressLocality
in: query
schema: { type: string }
- name: addressRegion
in: query
schema: { type: string }
- name: postalCode
in: query
schema: { type: string }
- name: telephoneNumber
in: query
schema: { type: string }
- name: registrationNumber
in: query
schema: { type: string }
- name: candidateMaximumQuantity
in: query
schema: { type: integer, minimum: 1, maximum: 50, default: 9 }
- name: confidenceLowerLevelThresholdValue
in: query
schema: { type: integer, minimum: 1, maximum: 10 }
responses:
'200':
description: Ranked match candidates returned.
content:
application/json:
schema:
$ref: '#/components/schemas/MatchResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/v1/search/criteria:
get:
tags:
- Search
summary: Search Companies By Criteria
description: >-
Find companies matching free-form criteria such as name, address,
registration number, industry, or contact. Returns a paginated list
of candidate records intended for browse-and-pick workflows rather
than authoritative match.
operationId: searchCompaniesByCriteria
security:
- bearerAuth: []
parameters:
- name: searchTerm
in: query
schema: { type: string }
- name: countryISOAlpha2Code
in: query
schema: { type: string }
- name: pageNumber
in: query
schema: { type: integer, minimum: 1, default: 1 }
- name: pageSize
in: query
schema: { type: integer, minimum: 1, maximum: 50, default: 50 }
responses:
'200':
description: Search results.
content:
application/json:
schema:
$ref: '#/components/schemas/SearchResponse'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/search/contact:
get:
tags:
- Search
summary: Search Contacts By Criteria
description: >-
Find named principals or contacts (executives, beneficial owners,
decision-makers) matching the supplied criteria, returning a
paginated candidate list.
operationId: searchContacts
security:
- bearerAuth: []
parameters:
- name: searchTerm
in: query
schema: { type: string }
- name: countryISOAlpha2Code
in: query
schema: { type: string }
- name: pageSize
in: query
schema: { type: integer, minimum: 1, maximum: 50, default: 50 }
responses:
'200':
description: Contact search results.
content:
application/json:
schema:
$ref: '#/components/schemas/ContactSearchResponse'
/v1/data/duns/{duns}:
get:
tags:
- Enrich
summary: Retrieve Data Blocks For D-U-N-S
description: >-
Retrieve one or more Data Blocks for a given D-U-N-S Number. The
caller specifies which blocks (Company Information, Principals &
Contacts, Hierarchy & Connections, Financial Strength, Risk &
Compliance, Beneficial Ownership, ESG, etc.) to include via the
blockIDs query parameter. Each block is independently versioned.
operationId: getDataBlocksByDuns
security:
- bearerAuth: []
parameters:
- name: duns
in: path
required: true
schema:
type: string
pattern: '^[0-9]{9}$'
description: Nine-digit D-U-N-S Number.
- name: blockIDs
in: query
required: true
schema:
type: string
description: >-
Comma-separated list of block IDs with version (e.g.
companyinfo_L2_v1,principalscontacts_L1_v2).
- name: tradeUp
in: query
schema: { type: string, enum: [hq] }
responses:
'200':
description: Requested data blocks for the D-U-N-S Number.
content:
application/json:
schema:
$ref: '#/components/schemas/EnrichResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/v1/multiProcess:
post:
tags:
- Multi-Process
summary: Match Plus Enrich In One Call
description: >-
Combine Identity Resolution and Enrich in a single request: supply
a candidate input record and the desired data blocks; Direct+ returns
the resolved D-U-N-S match together with all requested enrichment
payloads.
operationId: multiProcessMatchAndEnrich
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MultiProcessRequest'
responses:
'200':
description: Resolved match plus enrichment payloads.
content:
application/json:
schema:
$ref: '#/components/schemas/MultiProcessResponse'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/file:
post:
tags:
- Data File
summary: Submit Batch Data File
description: >-
Submit a batch input file for asynchronous match and enrichment.
Returns a fileID the caller polls until processing is complete.
operationId: submitBatchFile
security:
- bearerAuth: []
requestBody:
required: true
content:
multipart/form-data:
schema:
$ref: '#/components/schemas/BatchFileSubmission'
responses:
'202':
description: File accepted for processing.
content:
application/json:
schema:
$ref: '#/components/schemas/BatchSubmissionResponse'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/file/{fileId}/status:
get:
tags:
- Data File
summary: Get Batch File Status
description: >-
Poll the processing status of a previously submitted batch file.
Returns a state of PENDING, PROCESSING, COMPLETED, or FAILED along
with progress counters.
operationId: getBatchFileStatus
security:
- bearerAuth: []
parameters:
- name: fileId
in: path
required: true
schema: { type: string }
responses:
'200':
description: Batch file status.
content:
application/json:
schema:
$ref: '#/components/schemas/BatchStatusResponse'
'404':
$ref: '#/components/responses/NotFound'
/v1/file/{fileId}/download:
get:
tags:
- Data File
summary: Download Batch File Results
description: >-
Download the matched and enriched output file once status is
COMPLETED. The response is an octet-stream containing the result
file in the originally requested format.
operationId: downloadBatchFileResults
security:
- bearerAuth: []
parameters:
- name: fileId
in: path
required: true
schema: { type: string }
responses:
'200':
description: Batch result file.
content:
application/octet-stream:
schema: { type: string, format: binary }
'404':
$ref: '#/components/responses/NotFound'
/v1/monitoring/registrations:
post:
tags:
- Monitoring
summary: Create Monitoring Registration
description: >-
Register a portfolio of D-U-N-S Numbers for change monitoring. The
registration declares which data blocks to monitor and how
notifications should be delivered.
operationId: createMonitoringRegistration
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MonitoringRegistrationRequest'
responses:
'201':
description: Monitoring registration created.
content:
application/json:
schema:
$ref: '#/components/schemas/MonitoringRegistrationResponse'
/v1/monitoring/registrations/{registrationReference}/duns:
post:
tags:
- Monitoring
summary: Add D-U-N-S To Registration
description: >-
Add one or more D-U-N-S Numbers to an existing monitoring
registration's portfolio.
operationId: addDunsToRegistration
security:
- bearerAuth: []
parameters:
- name: registrationReference
in: path
required: true
schema: { type: string }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PortfolioMembershipRequest'
responses:
'200':
description: Portfolio updated.
content:
application/json:
schema:
$ref: '#/components/schemas/PortfolioMembershipResponse'
delete:
tags:
- Monitoring
summary: Remove D-U-N-S From Registration
description: >-
Remove one or more D-U-N-S Numbers from a monitoring registration's
portfolio.
operationId: removeDunsFromRegistration
security:
- bearerAuth: []
parameters:
- name: registrationReference
in: path
required: true
schema: { type: string }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PortfolioMembershipRequest'
responses:
'200':
description: Portfolio updated.
content:
application/json:
schema:
$ref: '#/components/schemas/PortfolioMembershipResponse'
/v1/monitoring/registrations/{registrationReference}/notifications:
get:
tags:
- Monitoring
summary: Pull Monitoring Notifications
description: >-
Pull pending change notifications for a monitoring registration.
Each notification describes the D-U-N-S Number affected, the block
that changed, the previous and new values, and the change timestamp.
operationId: pullMonitoringNotifications
security:
- bearerAuth: []
parameters:
- name: registrationReference
in: path
required: true
schema: { type: string }
- name: maximumQuantity
in: query
schema: { type: integer, default: 100, maximum: 1000 }
responses:
'200':
description: Notifications package.
content:
application/json:
schema:
$ref: '#/components/schemas/MonitoringNotificationsResponse'
/v2/audit/duns/{duns}:
get:
tags:
- Research
summary: Retrieve Historical Audit Record
description: >-
Retrieve a historical Direct+ response previously returned for a
D-U-N-S Number, supporting audit, dispute, and reconciliation use
cases.
operationId: getAuditRecord
security:
- bearerAuth: []
parameters:
- name: duns
in: path
required: true
schema:
type: string
pattern: '^[0-9]{9}$'
- name: transactionTimestamp
in: query
required: true
schema: { type: string, format: date-time }
responses:
'200':
description: Historical record.
content:
application/json:
schema:
$ref: '#/components/schemas/AuditResponse'
'404':
$ref: '#/components/responses/NotFound'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
basicAuth:
type: http
scheme: basic
responses:
Unauthorized:
description: Missing or invalid bearer token.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
NotFound:
description: Resource not found for the supplied identifier.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
schemas:
TokenRequest:
type: object
required: [grant_type]
properties:
grant_type:
type: string
enum: [client_credentials]
TokenResponse:
type: object
properties:
access_token: { type: string }
token_type: { type: string, example: Bearer }
expirationDateTime: { type: string, format: date-time }
MatchCandidate:
type: object
properties:
displaySequence: { type: integer }
matchQualityInformation:
type: object
properties:
confidenceCode: { type: integer }
matchGrade: { type: string }
matchDataProfile: { type: string }
organization:
$ref: '#/components/schemas/OrganizationSummary'
MatchResponse:
type: object
properties:
transactionDetail:
$ref: '#/components/schemas/TransactionDetail'
inquiryDetail:
type: object
matchCandidates:
type: array
items: { $ref: '#/components/schemas/MatchCandidate' }
OrganizationSummary:
type: object
properties:
duns: { type: string, pattern: '^[0-9]{9}$' }
primaryName: { type: string }
primaryAddress:
$ref: '#/components/schemas/Address'
countryISOAlpha2Code: { type: string }
telephone:
type: array
items: { type: object, properties: { telephoneNumber: { type: string } } }
registrationNumbers:
type: array
items: { type: object, properties: { registrationNumber: { type: string }, typeDescription: { type: string } } }
Address:
type: object
properties:
streetAddress:
type: object
properties:
line1: { type: string }
line2: { type: string }
addressLocality: { type: object, properties: { name: { type: string } } }
addressRegion: { type: object, properties: { name: { type: string }, abbreviatedName: { type: string } } }
postalCode: { type: string }
addressCountry: { type: object, properties: { isoAlpha2Code: { type: string } } }
SearchResponse:
type: object
properties:
transactionDetail: { $ref: '#/components/schemas/TransactionDetail' }
candidatesReturnedQuantity: { type: integer }
candidatesMatchedQuantity: { type: integer }
searchCandidates:
type: array
items:
type: object
properties:
organization: { $ref: '#/components/schemas/OrganizationSummary' }
ContactSearchResponse:
type: object
properties:
transactionDetail: { $ref: '#/components/schemas/TransactionDetail' }
candidatesReturnedQuantity: { type: integer }
searchCandidates:
type: array
items:
type: object
properties:
contact:
type: object
properties:
fullName: { type: string }
jobTitles:
type: array
items: { type: object, properties: { title: { type: string } } }
organization: { $ref: '#/components/schemas/OrganizationSummary' }
EnrichResponse:
type: object
properties:
transactionDetail: { $ref: '#/components/schemas/TransactionDetail' }
inquiryDetail: { type: object }
organization:
type: object
properties:
duns: { type: string }
primaryName: { type: string }
primaryAddress: { $ref: '#/components/schemas/Address' }
registrationNumbers:
type: array
items: { type: object }
corporateLinkage: { type: object }
financials:
type: array
items: { type: object }
principals:
type: array
items: { type: object }
beneficialOwnership: { type: object }
riskAssessment: { type: object }
MultiProcessRequest:
type: object
required: [inquiryDetail, blockIDs]
properties:
inquiryDetail:
type: object
properties:
name: { type: string }
countryISOAlpha2Code: { type: string }
address: { $ref: '#/components/schemas/Address' }
blockIDs:
type: array
items: { type: string }
MultiProcessResponse:
type: object
properties:
transactionDetail: { $ref: '#/components/schemas/TransactionDetail' }
matchCandidates:
type: array
items: { $ref: '#/components/schemas/MatchCandidate' }
organization:
type: object
description: Resolved enrichment payload for the top-ranked match.
BatchFileSubmission:
type: object
properties:
file:
type: string
format: binary
processId: { type: string, description: 'Direct+ process identifier (match, enrich, etc).' }
productId: { type: string }
BatchSubmissionResponse:
type: object
properties:
fileId: { type: string }
submissionTimestamp: { type: string, format: date-time }
status: { type: string, enum: [PENDING] }
BatchStatusResponse:
type: object
properties:
fileId: { type: string }
status: { type: string, enum: [PENDING, PROCESSING, COMPLETED, FAILED] }
processedRecordCount: { type: integer }
totalRecordCount: { type: integer }
MonitoringRegistrationRequest:
type: object
required: [registrationReference]
properties:
registrationReference: { type: string }
description: { type: string }
blockIDs:
type: array
items: { type: string }
deliveryMethod: { type: string, enum: [SFTP, API_PULL] }
MonitoringRegistrationResponse:
type: object
properties:
registrationReference: { type: string }
status: { type: string }
createdTimestamp: { type: string, format: date-time }
PortfolioMembershipRequest:
type: object
required: [dunsList]
properties:
dunsList:
type: array
items: { type: string, pattern: '^[0-9]{9}$' }
PortfolioMembershipResponse:
type: object
properties:
addedQuantity: { type: integer }
removedQuantity: { type: integer }
rejectedDuns:
type: array
items: { type: object, properties: { duns: { type: string }, reason: { type: string } } }
MonitoringNotificationsResponse:
type: object
properties:
notifications:
type: array
items:
type: object
properties:
duns: { type: string }
changeTimestamp: { type: string, format: date-time }
blockID: { type: string }
elementId: { type: string }
previousValue: {}
currentValue: {}
AuditResponse:
type: object
properties:
duns: { type: string }
transactionTimestamp: { type: string, format: date-time }
originalResponse: { type: object }
TransactionDetail:
type: object
properties:
transactionID: { type: string }
transactionTimestamp: { type: string, format: date-time }
inLanguage: { type: string }
serviceVersion: { type: string }
Error:
type: object
properties:
transactionDetail: { $ref: '#/components/schemas/TransactionDetail' }
error:
type: object
properties:
errorMessage: { type: string }
errorCode: { type: string }
errorDetails:
type: array
items: { type: object }