Core concepts

How businesses, establishments, legal entities, accounts, persons and transactions relate in the Coris API.

A business is data Coris knows about, and an account is that business in your portfolio. Every integration uses the six objects on this page.

  1. Legal entityThe registered owner.
  2. EstablishmentA location or website.legal_entity_id
  3. AccountOne merchant in your portfolio.establishment_id
  4. PersonAn owner or controller.account_id
    TransactionA payment on an account.account_id

Follow one business through the objects

Walk one business from its legal entity to an account, in the same session as the Quickstart.

  1. Read the legal entity behind the business.
LEGAL_ENTITY_ID=$(printf '%s' "$PROFILE" | jq -r '.legal_entity.id')

curl -s "$CORIS_BASE_URL/legal_entity/$LEGAL_ENTITY_ID/" \
  -H "Authorization: Token $CORIS_API_KEY" | jq
legal_entity_id = profile["legal_entity"]["id"]

response = requests.get(f"{BASE_URL}/legal_entity/{legal_entity_id}/", headers=HEADERS)
print(response.json())
const legalEntityId = profile.legal_entity.id;

const legalEntity = await fetch(`${BASE_URL}/legal_entity/${legalEntityId}/`, {
  headers: HEADERS,
});
console.log(await legalEntity.json());

Try GET /legal_entity/{legal_entity_id}/ in the API explorer.

  1. Create an account from establishment.id. With establishment_id, the 201 holds the account itself. With business details instead, the 201 holds a request_id to poll.
REFERENCE_ID="acme-plumbing-$(date +%s)"

ACCOUNT=$(curl -s -X POST "$CORIS_BASE_URL/accounts/" \
  -H "Authorization: Token $CORIS_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"reference_id\": \"$REFERENCE_ID\", \"establishment_id\": \"$ESTABLISHMENT_ID\"}")

ACCOUNT_ID=$(printf '%s' "$ACCOUNT" | jq -r '.id')
echo "$ACCOUNT_ID"
reference_id = f"acme-plumbing-{int(time.time())}"

response = requests.post(
    f"{BASE_URL}/accounts/",
    headers=HEADERS,
    json={"reference_id": reference_id, "establishment_id": establishment_id},
)
response.raise_for_status()
account_id = response.json()["id"]
print(account_id)
const referenceId = `acme-plumbing-${Date.now()}`;

const createdAccount = await fetch(`${BASE_URL}/accounts/`, {
  method: "POST",
  headers: HEADERS,
  body: JSON.stringify({ reference_id: referenceId, establishment_id: establishmentId }),
});
if (!createdAccount.ok) throw new Error(await createdAccount.text());
const account = await createdAccount.json();
const accountId = account.id;
console.log(accountId);

Try POST /accounts/ in the API explorer.

  1. Read the account back with your own ID. Most paths that take account_id also accept your reference_id. The Merchant Profiler PDF report paths take only the Coris id.
curl -s "$CORIS_BASE_URL/accounts/$REFERENCE_ID/" \
  -H "Authorization: Token $CORIS_API_KEY" | jq
response = requests.get(f"{BASE_URL}/accounts/{reference_id}/", headers=HEADERS)
print(response.json())
const byReference = await fetch(`${BASE_URL}/accounts/${referenceId}/`, {
  headers: HEADERS,
});
console.log(await byReference.json());

Try GET /accounts/{account_id}/ in the API explorer.

Read the response

Step 3 returns the account. This sample is shortened.

{
  "id": "c47f0e21-6a9b-4d38-a2e5-1b8d3f90c6a7",
  "reference_id": "acme-plumbing-1762300800",
  "name": "Acme Plumbing Co.",
  "created": 1762300800,
  "updated": 1762300800,
  "tpv": 0,
  "legal_name": null,
  "dba_name": null,
  "source": "api"
}
FieldMeaningWhat to do
idThe Coris account ID.Store it, or use reference_id instead.
reference_idYour ID for this merchant.Keep it unique. A repeat returns 409.
tpvPayment volume in USD cents over the last 450 days.0 means none yet. Other routes can return null, which means not available.

The six objects

ObjectWhat it isIDCreated by
BusinessThe real-world company. In the API it is an establishment with its legal entity.No single ID. Use establishment.id.Coris, through search or Merchant Profiler
EstablishmentA location or website where the business operates.establishment.idCoris
Legal entityThe registered owner of the business.legal_entity.idCoris
AccountOne merchant in your portfolio, linked to an establishment.id and your reference_idYou, or a Stripe or Adyen event
PersonAn owner or controller of an account.idYou, or a processor event
TransactionA payment on an account.id and your transaction_idYou, or a processor event

Establishments and legal entities are Coris-sourced data. Accounts, persons and transactions belong to your workspace.

Which ID you hold at each step

After this callYou holdUse it for
Merchant Profiler or Business Searchestablishment.id, legal_entity.id/establishment/ and /legal_entity/ endpoints, and establishment_id on POST /accounts/
Create an accountid, and your reference_id/accounts/ endpoints. From here, carry the account ID.

See the glossary for KYB, MCC, OFAC and other terms.

What to do next

Your goalObject to start from
Check a business onceEstablishment and legal entity. No account needed.
Watch a merchant over timeAccount. See Monitor your portfolio.
Send a whole portfolioAccounts, by file or API. See Fintechs, ISOs and sponsor banks.

FAQ

When do I need an account?

You need one for monitoring, persons, transactions and tags. Business data calls work without it.

Can two accounts share one establishment?

Yes. Each has its own reference_id, so two merchant records can point to one establishment.

What does the sandbox reference_id need to be?

Any string that is new in your workspace. The samples add a timestamp so you can run them twice.

Next: Authenticate your requests


Did this page help you?