Skip to main content
For AI agents: a documentation index is available at https://docs.coverbase.com/llms.txt. This page is also available in markdown by appending .md to the URL.
A vendor’s supplier profile is what your organization holds about how to pay and reach that supplier: its bank accounts, its sites (addresses and other locations), its tax and company registrations, its diversity records, and the legal entities of yours it is assigned to. In the dashboard these are the records on the vendor’s Know-Your-Vendor tab; see Supplier information. This API is how a finance system or middleware reads those records, writes them, and keeps up with changes to them. The profile is not an object with an ID of its own. Every record in it belongs to a vendor (cbvndr_...) and lives under /v1/vendors/{vendor_id}/. The one exception is the list of your own legal entities, at /v1/legal_entities.
Know Your Vendor is not on for every organization. While it is off, every endpoint on this page returns 404 with the code not_enabled. If you get that response, ask your Coverbase account team to turn it on.
All endpoints are org-scoped to the API key. See API conventions for authentication, IDs, timestamps and the error envelope. None of them honor Idempotency-Key. A tax registration write is an upsert and safe to repeat; the other writes are not, so list the records before you retry one that timed out. No endpoint needs a scope: a standard integration key can call all of them. The scopes in the last column change what a call returns or does; see masking and scopes.
A successful bank write is not a changed bank account. By default a new or changed account waits for a reviewer, and the call answers 202 Accepted with a review ID. Update your finance system only when the account goes live: the VendorBankAccount webhook fires on approval, and the change feed records an approved event.

How the profile fits together

What a profile holds

Two more IDs appear in responses: a legal entity (cble_...) is one of your own contracting entities, set up under Configuration → Legal entities, and a bank change review (cbbarev_...) is a bank write waiting for a reviewer. Sites are also the vendor’s locations: the sites you read and write here are the ones on the vendor’s Locations card and on the Risk geography map.

Who changes what

Changes to these records, whoever makes them, are appended to the vendor’s change history. The same history drives the Know-Your-Vendor tab, the supplier profile webhooks and the change feed. A change made with an API key is recorded with actor_type api and actor_label API, and the records it creates carry source api.

What waits for approval

Both settings are in Configuration → Know Your Vendor Settings; see Configuring it for your organization. A reviewer decides a queued bank change on the vendor’s Know-Your-Vendor tab or on the Vendor changes page. The API has no call to approve or reject one. Retiring a bank account never waits.

Masking and scopes

An API key authenticates as a service account. With a standard key, an account number, IBAN or tax identifier comes back as its last four characters (****6789), a bank account’s other fields are not returned apart from its SWIFT/BIC, and every bank write queues for review. An admin can grant a key two scopes that change this, under Admin scopes (optional) on the API keys page: Grant either only to a key that needs it. See API key scopes and role-based masking. A dashboard session token also works on these endpoints, but it never unmasks values and never skips review.

Country rules and validation

Bank accounts, sites and tax registrations are checked against the rules for their country, which Supplier countries lists field by field. Values are normalized first, and the normalized value is what Coverbase stores: spaces come out of an IBAN, and a United Kingdom sort code shorter than six digits is padded with leading zeros.
  • An error rejects the write with 422 and the code validation_failed, and nothing is saved.
  • A warning lets the write through. The warning is kept on the record’s validation_results.
A country Coverbase has no rules for is not refused: the values are stored unchecked, and config_version reads unconfigured. Every record that was validated carries the outcome in validation_results:
A write that fails validation returns the same results in the error body. It uses an error key rather than the usual code:

Errors every endpoint can return

Authentication failures and the IP allowlist behave as on every public endpoint; see API conventions. Calls made with an ak_ key are recorded in the public API audit log.

Bank accounts

The bank account object

string
Bank account ID (cbvba_...).
string
The vendor the account belongs to.
string | null
Two-letter country code of the bank that holds the account. null on an account recorded before country validation existed.
string | null
Three-letter currency code, upper case.
string | null
A label for the account, such as Operating account. It is not the account holder’s name.
string | null
The last four characters of the account number, as ****6789.
string | null
The last four characters of the IBAN.
string | null
The SWIFT/BIC in full. It identifies the bank, not the account, so it is never masked.
boolean
Whether this is the vendor’s primary account. A vendor has at most one.
string
active, or retired on the response to a retire call.
string
passed, passed_with_warnings, or not_validated for an account recorded before country validation existed.
object
string | null
The country rules version the account was validated against.
string | null
domestic or wire, derived when the account was saved. It is wire when the bank’s country is not one your assigned legal entities pay from, and null when the vendor had no active legal entity assignment with a country at the time.
string | null
A vendor document (cbvdoc_...) attached as proof the account belongs to the supplier.
string | null
Where the account came from: questionnaire, portal, api, internal or migration.
integer
Unix timestamp (seconds).
integer
Unix timestamp (seconds).
object | null
Every field of the account in full, keyed by field key. A field the account does not use is an empty string. Present only on list bank accounts for a key with banking:read; null everywhere else.

List bank accounts

GET
GET /v1/vendors/{vendor_id}/bank_accounts
Returns the vendor’s active bank accounts as a plain array, primary first, then oldest first. Retired accounts and changes still waiting for review are not included. The list is not paginated. Auth: any ak_ key. With banking:read, each account also carries values.

Path parameters

string
required
The vendor ID (cbvndr_...).

Example request

cURL

Example response

200 OK, for a key with banking:read. Without the scope, values is null.

Add a bank account

POST
POST /v1/vendors/{vendor_id}/bank_accounts
Validates the account against its country’s rules, then either queues it for a reviewer or saves it. Auth: any ak_ key. A key with review:sensitive_changes skips the review queue.

Path parameters

string
required
The vendor ID (cbvndr_...).

Request body

string
required
Two-letter country code of the bank that holds the account, which is not always the supplier’s own country. It decides which fields are asked for and which rules apply.
object
required
The account’s fields, keyed by field key, for example {"branch_code": "076401251", "account_number": "000123456789", "account_type": "checking"}. Keys the country does not define are dropped. Values can be null.
string
Three-letter currency code. BRL is refused when the supplier’s own address is outside Brazil, judged by its primary site (or its first site, if none is primary). A supplier with no sites is not checked.
string
A label for the account. On a write that is queued for review, it takes effect when the change is approved.
boolean
true makes this the vendor’s primary account and demotes the current one. Omit it or send false for a secondary account.
string
A document already uploaded for this vendor with the Documents API (cbvdoc_...), such as a bank statement showing the account belongs to the supplier. A document of another vendor is refused with 422 and the code invalid_document. On a write that is queued for review, it is attached when the change is approved.

Example request

cURL

Example responses

202 Accepted: the account is queued for review. This is the default outcome.
Coverbase tells the people named in Notify these people, or, when nobody is named, the vendor’s relationship owners (its risk analysts if it has none). The change feed records a submitted event whose entity_id is the review_id. See following a queued bank change. 201 Created: the account is saved, because your organization has turned off Bank changes need a reviewer or the key carries review:sensitive_changes. The body is the bank account object, with values always null. The VendorBankAccount.Created webhook fires.

Error responses

Update a bank account

PATCH
PATCH /v1/vendors/{vendor_id}/bank_accounts/{bank_account_id}
Replaces an account’s details. It takes the same body as add a bank account, and bank_country and values are required. values replaces the whole set, so send every field the account should keep, not only the one that changed. Auth: any ak_ key. A key with review:sensitive_changes skips the review queue. The outcomes match the add call: 202 Accepted with a review_id while the change waits for a reviewer, or 200 OK with the updated bank account object when it is applied at once. The live account keeps serving its current details until a reviewer approves.
A PATCH whose values match what the account already holds is not a bank change. Its currency, bank_account_name, is_primary and statement_document_id are applied at once, without review, and when one of them changes, the change feed records an updated event and VendorBankAccount.Updated fires. Sending back exactly what is stored records nothing. Any difference in values, including a new swift_bic, bank_name or account_type on the same account number, is a bank change and waits for review like any other.

Path parameters

string
required
The vendor ID (cbvndr_...).
string
required
The bank account ID (cbvba_...). It must belong to vendor_id.

Example request

cURL

Error responses

Retire a bank account

POST
POST /v1/vendors/{vendor_id}/bank_accounts/{bank_account_id}/retire
Retires an account at once; retiring never waits for review. The account stops being primary, drops out of list bank accounts, and the VendorBankAccount.Retired webhook fires. The call takes no body and returns 200 OK with the bank account object, status set to retired. Calling it again on a retired account returns the account unchanged and records nothing, so a retry is safe. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).
string
required
The bank account ID (cbvba_...). It must belong to vendor_id.

Example request

cURL

Error responses

Following a queued bank change

The review ID is the only handle a queued change has, and the API has no endpoint that reads a review. Follow it through the change feed:
  • A rejected event on bank_account whose entity_id is your review_id means the reviewer turned it down, and its snapshot carries the rejection_reason. The live account never changed.
  • An approved event on bank_account means it went live. Its entity_id is the bank account ID, not the review ID: for a change to an existing account it is the account you patched, and for a new account it is the account the approval created, which then appears in list bank accounts. Nothing in the event names the review, so match a new account to your request by vendor, bank_country and account_number_masked.

Sites

A site is one place the supplier operates, at whatever precision is known: a full street address, a city, or a country on its own. Only the country is required. Sites carry the addresses your finance system pays and orders against, and they are the vendor’s locations on the Risk geography map.

The site object

string
Site ID (cbsite_...).
string
The vendor the site belongs to.
string | null
The service this location belongs to, when someone scoped it to one on the vendor page. The API does not set it.
string | null
First address line.
string | null
Second address line.
string | null
Third address line.
string | null
Fourth address line.
string | null
City or town.
string | null
State, province or region, as given: an ISO 3166-2 code such as NY, or free text.
string | null
County, where the country files one separately from the state.
string | null
Postal code.
string
Two-letter country code. Always present.
string | null
A short label for the location, such as Global HQ.
string
What happens at this location, in your words. An empty string when there is none.
string | null
ordering, billing, service_delivery, hq or other. A label set on the vendor page; nothing derives it.
string | null
What the address is for in your finance system: primary or remittance. An address is a registration address by carrying a tax registration, not by its purpose.
string | null
Your finance system’s code for this address.
string | null
Your finance system’s identifier for this address as a remit-to site.
string | null
Derived from the address unless the API sets it: the country code, or the country and subdivision (US-NY) in the United States, Canada, India and Brazil. The supplier is never asked for it.
string[]
Where purchase orders for this address are emailed.
string[]
Where remittance advice for this address is emailed.
boolean
Whether this is the vendor’s primary site. A vendor has at most one.
number | null
Filled in by Coverbase after the site is saved, from the address. null until then, and always null for a country-only site.
number | null
As latitude.
string
active. Deleted sites are not returned.
string
Where the site came from: questionnaire, portal, api, internal or migration.
object
The validation outcome. Postal-code format problems, over-long address lines and a missing PO email address are warnings, never errors.
integer
Unix timestamp (seconds).
integer
Unix timestamp (seconds).

List sites

GET
GET /v1/vendors/{vendor_id}/sites
Returns the vendor’s sites as a plain array, primary first, then oldest first. The list is not paginated. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Example request

cURL

Example response

200 OK:

Add a site

POST
POST /v1/vendors/{vendor_id}/sites
Adds a site and returns 201 Created with the site object. The SupplierSite.Created webhook fires. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Request body

string
required
Two-letter country code. A site with only a country is a complete answer.
string
Up to 255 characters. So are address_line2, address_line3 and address_line4.
string
Up to 120 characters.
string
Up to 120 characters. Send the ISO 3166-2 subdivision code (NY or US-NY) where you have it: in the United States, Canada, India and Brazil the tax region is built from it, and a name such as New York gives the country-level region.
string
Up to 120 characters.
string
Up to 32 characters. Checked against the country’s format, as a warning only.
string
Up to 120 characters.
string
Up to 500 characters.
string
ordering, billing, service_delivery, hq or other.
string
primary or remittance.
string
Up to 60 characters.
string
Up to 60 characters.
string
Up to 60 characters. Your finance system’s own tax region for this address. Omit it and Coverbase derives one from the address.
string[]
Up to 20 addresses where purchase orders for this address are emailed. A malformed address is refused with 422. A primary site with an address line and no PO email saves with an email.missing warning, except in China, where no PO email is asked for.
string[]
Up to 20 addresses where remittance advice for this address is emailed. A site whose address_purpose is remittance and has none saves with an email.missing warning.
boolean
default:"false"
true makes this the vendor’s primary site and demotes the current one.

Example request

cURL
The response is the new site object, like the first site in the list example with latitude and longitude still null.

Error responses

Update a site

PATCH
PATCH /v1/vendors/{vendor_id}/sites/{site_id}
Takes the same body as add a site and returns 200 OK with the updated site object. The SupplierSite.Updated webhook fires. Auth: any ak_ key. Treat it as a replacement of the address rather than a partial update:
  • country_code is required.
  • Omitting an address line, city, state_province, county, postal_code, location_code, csp_remit_to_id or description clears it. Send every value you want to keep.
  • Omitting site_name, site_context or address_purpose keeps the stored value. An empty site_name clears it; the other two cannot be cleared here.
  • Omitting po_emails or remittance_emails keeps the stored list. Send [] to clear one.
  • Omitting tax_region derives it from the address again.
  • is_primary: true makes the site primary. false does not demote it; mark another site primary instead.
  • Changing the address (other than address_line2) clears latitude and longitude until Coverbase places the new one.

Path parameters

string
required
The vendor ID (cbvndr_...).
string
required
The site ID (cbsite_...). It must belong to vendor_id.

Example request

cURL

Error responses

Delete a site

DELETE
DELETE /v1/vendors/{vendor_id}/sites/{site_id}
Removes the site and returns 204 No Content. It no longer appears in list sites, on the vendor’s Locations card or on the map. The change history keeps the record of it, and the SupplierSite.Deleted webhook fires. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).
string
required
The site ID (cbsite_...). It must belong to vendor_id.

Example request

cURL

Error responses

Tax registrations

A tax registration is one tax or company identifier the supplier holds in one country, such as a US EIN or a UK VAT number, or a declared exemption in place of one. A registration can belong to the supplier as a whole or to one of its sites. After a registration is saved, Coverbase checks it against the public register for that country where one exists, in the background. The check never blocks a write; it updates registry_status when it completes.

The tax registration object

string
Tax registration ID (cbtaxreg_...).
string
The vendor the registration belongs to.
string
Two-letter country code.
string
Which identifier this is, as a tax ID type key such as ein or vat.
string | null
The last four characters of the identifier. null for an exemption.
string
How far verification got: format, checksum (its check digits are valid) or registry (the public register confirmed it). The schema also defines document, which nothing sets.
string
passed, passed_with_warnings, or not_validated for an exemption.
string | null
pending, verified, not_found or unavailable. unavailable means the register could not be reached and says nothing about the supplier. null when the country has no register Coverbase checks.
string | null
The register that answered.
integer | null
Unix timestamp (seconds) of the last register check.
string | null
The site the registration belongs to.
boolean
Whether this records an exemption rather than a number.
string | null
Why the supplier is exempt.
string | null
A vendor document (cbvdoc_...), such as the registration certificate.
object
integer
Unix timestamp (seconds).
integer
Unix timestamp (seconds).
string | null
The identifier in full. Present only on list tax registrations for a key with banking:read; null everywhere else.

List tax registrations

GET
GET /v1/vendors/{vendor_id}/tax_registrations
Returns the vendor’s tax registrations as a plain array, ordered by country and then by type. The list is not paginated. Auth: any ak_ key. With banking:read, each registration also carries value.

Path parameters

string
required
The vendor ID (cbvndr_...).

Example request

cURL

Example response

200 OK, for a key without banking:read:

Add or update a tax registration

POST
POST /v1/vendors/{vendor_id}/tax_registrations
Saves a registration and returns 201 Created with the tax registration object, whether it created a registration or updated one. A vendor holds one registration per country and type, and separately one per site, country and type: posting the same country_code and tax_id_type again (with the same site_id, or none) updates that registration. A new number restarts the register check. The SupplierTaxRegistration.Updated webhook fires in both cases. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Request body

string
required
Two-letter country code of the registration.
string
required
The tax ID type key for that country, such as ein, vat or tax_id. Keys are case-sensitive. A key the country does not define is stored without any format or checksum check, so check the spelling.
string
The identifier, 1 to 64 characters. Required unless is_exempt is true, and refused when it is.
string
One of this vendor’s active sites (cbsite_...), for a registration held at that address. Omit it for the supplier’s own registration.
boolean
default:"false"
true records that the supplier is exempt from this registration instead of giving a number.
string
Why the supplier is exempt, up to 500 characters. Required when is_exempt is true.
string
A document already uploaded for this vendor with the Documents API (cbvdoc_...), such as the registration certificate. A document of another vendor is refused with 422 and the code invalid_document. Omitting it on an update keeps the one already attached. In Argentina, Brazil, Chile, Colombia, Costa Rica, the Dominican Republic, Ecuador, Guatemala, Mexico, Panama, Paraguay, Peru and Uruguay, a registration without a certificate saves with a tax_certificate.expected warning.

Example request

cURL
The response is the saved registration, as in the list example. The EIN is stored normalized, as 123456789.

Error responses

Diversity records

A diversity record is the supplier’s declaration for one inclusion category, optionally backed by a certificate. Suppliers submit them through a questionnaire or the portal, and your staff can enter them on the Know-Your-Vendor tab. The API reads them but does not write them.

List diversity records

GET
GET /v1/vendors/{vendor_id}/diversity_records
Returns the vendor’s diversity records as a plain array, ordered by category. The list is not paginated. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Example request

cURL

Example response

200 OK:

Diversity record object

string
Diversity record ID (cbdiv_...).
string
The vendor the record belongs to.
string
minority_owned, women_owned, veteran_owned, service_disabled_veteran_owned, disability_owned, lgbtq_owned, small_business, small_disadvantaged_business, hubzone, historically_black_college, indigenous_owned, aboriginal_owned, other, or none_declared. none_declared is the supplier stating it holds none of the others, which is a different answer from never having been asked.
boolean
Whether the supplier claims the category.
string | null
Two-letter country code the certification applies in.
string | null
large, medium or small, as certified. It is not worked out from headcount.
string | null
The certifying body or program.
string | null
The level of certification, where the program has levels.
string | null
The certificate, as a vendor document (cbvdoc_...).
integer | null
Unix timestamp (seconds) the certificate is valid from.
integer | null
Unix timestamp (seconds) the certificate expires.
integer
Unix timestamp (seconds).
integer
Unix timestamp (seconds).
Your legal entities are your own contracting entities, maintained under Configuration → Legal entities. An assignment says a supplier trades with one of them. The entity’s entity_code is what your finance system matches on, and its country decides whether a payment to a supplier’s bank account is domestic or wire.
GET
GET /v1/legal_entities
Returns your organization’s active legal entities as a plain array, ordered by name. Deactivated entities are left out. The list is not paginated. Auth: any ak_ key.

Query parameters

Case-insensitive substring match on the entity’s name or entity code.

Example request

cURL

Example response

200 OK:
string
Legal entity ID (cble_...).
string
The entity’s name.
string
The code your finance system knows the entity by.
string | null
The country the entity pays from.
string | null
A free-text description.
boolean
Always true here.
integer
Unix timestamp (seconds).
integer
Unix timestamp (seconds).
GET
GET /v1/vendors/{vendor_id}/legal_entity_assignments
Returns every assignment for the vendor, newest first, including requested and rejected ones. The list is not paginated. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Example request

cURL

Example response

200 OK:
string
Assignment ID (cblea_...).
string
The vendor.
The legal entity (cble_...).
The entity’s name.
string | null
The entity’s code.
string | null
The supplier site the assignment is for, if one was given.
string
requested (waiting for approval), active or rejected.
string | null
The user who requested it (cbuser_...). For an assignment made through the API, this is your organization’s API service account.
integer | null
Unix timestamp (seconds) of the decision. Set at creation when no approval is needed.
string | null
The reviewer’s reason, for a rejected assignment.
integer
Unix timestamp (seconds).
POST
POST /v1/vendors/{vendor_id}/legal_entity_assignments
Assigns the vendor to one or more of your legal entities and returns 201 Created with an array of the new assignments. The call is all or nothing: if any entity in the batch is already assigned, nothing is created. Each assignment is active at once, and fires the SupplierLegalEntityAssignment.Assigned webhook with the entity code, unless Legal entity assignments need approval is on. Then it is requested until someone decides it in the dashboard. An active assignment’s country feeds the payment method of bank accounts saved after it; an account already on file keeps its method until it is next saved. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Request body

One to five legal entity IDs (cble_...) from list your legal entities. Each must be one of your active legal entities: an ID that is not, including a deactivated entity, fails the whole call and nothing is created.
string
One of this vendor’s sites (cbsite_...) that the assignments are for.
integer
The age in days, 0 to 3650, of the purchase requisition behind the request. Above 30 days, a justification is required. Omit it when no requisition is quoted.
string
Why a requisition older than 30 days should still be honored. Up to 500 characters.

Example request

cURL

Error responses

Update requests

An update request asks a supplier to review and update named sections of their profile. Coverbase sends the supplier no email: the request opens those sections on the Profile page of the centralized supplier portal, where each is marked as one you asked about. It therefore reaches only a supplier who has a portal, in an organization that has turned the Profile section on. The sections stay open until the request expires, alongside any sections your organization leaves open all the time. While a request is open, Coverbase reminds the vendor’s relationship owners (or, if it has none, its risk analysts) 3 and 7 days after it was sent. When its expiry date passes, the request becomes expired.

The update request object

string
Update request ID (cbupdreq_...).
string
The vendor.
string[]
The sections the request covers. See send an update request for the values.
string | null
The message stored with the request.
string | null
The contact email you gave.
string | null
The contact name you gave.
string
sent while open, draft if created with send: false, and expired once past expires_at. The schema also lists in_progress, submitted, reviewed and closed; no current workflow moves a request into those.
integer | null
Unix timestamp (seconds) the request was sent.
integer | null
Unix timestamp (seconds) the supplier submitted.
integer | null
Unix timestamp (seconds) the request expires.
integer[]
The reminders already sent, by day: 3, 7.
string | null
null for a request sent through the API.
integer
Unix timestamp (seconds).
integer
Unix timestamp (seconds).

List update requests

GET
GET /v1/vendors/{vendor_id}/update_requests
Returns the vendor’s update requests as a plain array, newest first. The list is not paginated. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Example request

cURL

Send an update request

POST
POST /v1/vendors/{vendor_id}/update_requests
Creates a request and, unless send is false, sends it. Returns 201 Created with the update request object. The dashboard has no button for this; the API is the only way to send one. Auth: any ak_ key.

Path parameters

string
required
The vendor ID (cbvndr_...).

Request body

string[]
The sections to open, from the values in the table below. Omit it or send [] to use Sections to request by default from Know Your Vendor Settings, which is po_email, addresses and bank_accounts unless your organization changed it.
string
A message stored with the request, up to 2000 characters.
string
The supplier contact the request is for. Stored and returned as recipient_email; Coverbase does not email it.
string
The contact’s name, returned as recipient_name.
boolean
default:"true"
false saves the request as a draft, which opens nothing. No endpoint sends a draft later.
The request expires after Request expires after (days) in Know Your Vendor Settings, 30 days by default.

Example request

cURL

The change feed

Changes to your vendors’ supplier profiles are appended to one org-wide history of change events (cbpce_...), and nothing edits or deletes an event once written. The feed returns that history oldest first. Use it to reconcile after missed webhooks, or poll it instead of receiving webhooks at all.

The change event object

string
Change event ID (cbpce_...). Webhooks for the same change carry it as change_event_id, so use it to deduplicate across the two.
string
The vendor the change belongs to.
string
What changed: bank_account, site, tax_registration, diversity_record or legal_entity_assignment.
string | null
The ID of the record that changed. For a queued or rejected bank change, it is the review ID (cbbarev_...).
string
created, updated, deleted, retired, submitted, approved, rejected or revealed. See what the feed records.
string
supplier_portal, internal_user, api or system.
string | null
Who made the change, for display: API, Supplier portal (a questionnaire answer), a portal user’s email address, a staff member’s name, or null.
string
sensitive for every bank account event, normal otherwise.
object
The fields that changed, each as { "old_value", "new_value" }. Account and tax numbers appear only as their last four characters.
object
The record as saved after the change, masked the same way. A legal entity assignment’s snapshot includes the entity’s entity_code and the site.
integer
Unix timestamp (seconds).

What the feed records

The feed is the audit trail, so it holds more than the webhooks send. Filter on action before you apply anything to your finance system.

List changes

GET
GET /v1/vendors/changes
Returns one page of change events across all vendors, oldest first. Auth: any ak_ key.

Query parameters

integer
Unix timestamp (seconds). Returns events at or after this time. Omit it to start from the first event.
string[]
Only these entity_type values, from the five above. Repeat the parameter for more than one: types=bank_account&types=site. Any other value is rejected with 422.
string
The next_cursor from the previous page. Treat it as opaque. A cursor Coverbase cannot read is ignored, and the feed starts again from since, or from the first event without one.
integer
default:"100"
Page size, 1 to 500.

Example request

cURL

Example response

200 OK:
object[]
The page of change events, oldest first.
string | null
Pass it as cursor to get the next page. null on the last page.
boolean
Whether another page follows.

Keeping up with the feed

Page with cursor until has_more is false. The last page carries no cursor, so remember the created_at of the last event you applied and pass it as since on your next poll. Events from that same second come back again, so skip any id you have already applied.

Field keys

The API names each field by a key, while the dashboard and the supplier’s form show a label that differs by country. These keys come from the rules Coverbase ships for each country. If Coverbase has overridden a country’s rules for your organization, ask your account team which keys changed.

Bank account values

Every country uses the same keys for the common fields, whatever the form calls them: Nine countries add their own: Which keys a country requires is on its page under Supplier countries.

Tax ID types

Sixty-nine countries use a single key, tax_id, for their tax or VAT number. The other forty use the keys below.