> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cadanapay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Hire Through EOR End-to-End

> Employ workers in countries where you have no entity — Cadana is the legal employer, you direct the work, and every step runs through the API

export const ApiExample = ({method = "GET", path, params, body, reference, tenantKey}) => {
  const baseUrl = "https://api.cadanapay.com";
  const query = params ? "?" + Object.entries(params).map(([k, v]) => `${k}=${v}`).join("&") : "";
  const url = `${baseUrl}${path}${query}`;
  const isPlatformPath = (/^\/(v1\/)?platform(\/|$)/).test(path || "");
  const includeTenantKey = tenantKey === undefined ? !isPlatformPath : tenantKey;
  let curl = `curl -X ${method} '${url}' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'`;
  if (includeTenantKey) {
    curl += ` \\\n  -H 'X-MultiTenantKey: YOUR_BUSINESS_TENANT_KEY'`;
  }
  if (body) {
    const formatted = JSON.stringify(body, null, 2);
    curl += ` \\\n  -H 'Content-Type: application/json' \\\n  -d '${formatted}'`;
  }
  return <div>
      <CodeBlock language="bash" filename="bash" wrap>
        {curl}
      </CodeBlock>
      {reference && <div style={{
    marginTop: "-0.5rem",
    marginBottom: "1rem"
  }}>
          <a href={reference} style={{
    fontSize: "0.875rem"
  }}>
            Try it in the playground →
          </a>
        </div>}
    </div>;
};

With the Employer of Record (EOR) model, Cadana is the worker's legal employer. Cadana holds the employment agreement, runs compliant payroll, withholds and remits taxes and statutory contributions, and handles compliant termination. You direct the day-to-day work, and you integrate the whole lifecycle through the same APIs used for direct employment — EOR is a mode, not a separate product surface.

This guide walks the full EOR lifecycle and links into the detailed guide for each step. If you employ workers under your own entity and only need payroll, see [Pay an Employee End-to-End](/workforce/pay-an-employee) — the two flows share most steps.

## How Responsibilities Split

|                      | You (the client)                                        | Cadana                                              |
| :------------------- | :------------------------------------------------------ | :-------------------------------------------------- |
| Work direction       | Day-to-day management, role, performance                | —                                                   |
| Worker data          | Provide profile, statutory fields, payment details      | Validates against jurisdiction rules                |
| Employment agreement | Review; countersign where applicable                    | Issues the compliant local contract                 |
| Payroll              | Approve payroll runs                                    | Calculates, withholds, remits, files                |
| Funding              | Fund the payroll debit (gross + employer contributions) | Collects and disburses                              |
| Termination          | Request offboarding with exit date and reason           | Executes compliantly (notice, severance, final pay) |

## Step 1 — Estimate the Cost of Hire

Before making an offer, estimate the full employer cost — gross↔net plus employer-side contributions — with the [Employment Cost Calculator](/tax/estimate). No person record is needed:

<ApiExample method="POST" path="/v1/tax/estimate" body={{ countryCode: "IN", salary: { amount: 20090000, currency: "INR" }, frequency: "monthly", type: "gross" }} reference="/api-reference/tax/tax-calculator/estimate-gross-or-net-salary" />

The response's `employerContributions` array is what you will fund on top of gross pay under EOR — see [Employment Models](/workforce/employment-models) for exactly what the payroll debit collects.

## Step 2 — Confirm EOR Availability and Local Employment Rules

List jurisdictions filtered to EOR support — each country reports its `eorStatus` alongside the `workerTypes` and `employmentModels` it supports:

<ApiExample method="GET" path="/v1/statutory/jurisdictions" params={{ employmentModel: "eor" }} reference="/api-reference/statutory/jurisdictions/list-supported-jurisdictions" />

Then fetch the jurisdiction's details. For EOR countries the response carries an `eor` block with the local employment rules you need to shape a compliant offer — probation and fixed-term limits, working hours, notice periods, statutory leave minimums, 13th-salary obligations, payout constraints, and termination rules. Numeric fields carry a `value` (`null` where no statutory rule exists) plus `notes` explaining the underlying statute:

<ApiExample method="GET" path="/v1/statutory/jurisdictions/MX" reference="/api-reference/statutory/jurisdictions/get-jurisdiction-details" />

```json theme={null}
{
  "countryCode": "MX",
  "eorStatus": "live",
  "eor": {
    "payroll": {
      "payrollFrequency": { "value": "semi-monthly", "notes": "Quincenal payroll is required for salaried employees — LFT Art. 88 caps the pay period at 15 days…" },
      "thirteenthSalaryRequired": { "value": true, "notes": "Aguinaldo: minimum 15 days' salary, pro-rated for partial years, payable by December 20 (LFT Art. 87)…" }
    },
    "payoutMethod": {
      "walletPayoutAllowed": { "value": true, "notes": "LFT Art. 101 permits salary payment by bank deposit, card, transfer or other electronic means with the worker's prior consent…" }
    },
    "employmentTerms": {
      "probationMaxMonths": { "value": 1, "notes": "30 days for standard indefinite contracts (LFT Art. 39-A), extendable to ~6 months for managerial or specialized roles…" },
      "workingHoursPerWeek": { "value": 48, "notes": "8h/day over a 6-day day-shift week; the enacted 40-hour reform phases in from 2027…" }
    },
    "leave": { "annualLeaveMinDays": { "value": 12, "notes": "Working days after 1 year of service (Vacaciones Dignas reform); rises 2 days/year to 20 at year 5…" } },
    "termination": { "severanceSummary": "Without cause: 3 months' integrated salary plus 20 days' salary per year of service plus seniority premium of 12 days per year…" }
  }
}
```

Finally, discover every data field the jurisdiction requires you to collect, exactly as in [Pay an Employee, step 2](/workforce/pay-an-employee#step-2--discover-what-data-the-jurisdiction-needs).

## Step 3 — Create the EOR Employee

Create the person with `compInfo.employmentModel: "eor"`, then complete their identity details, tax profile, statutory filing fields, and payment details. This is identical to [Pay an Employee, steps 3–7](/workforce/pay-an-employee#step-3--create-the-employee) — the employment model changes what the payroll debit collects, not how you submit data.

<ApiExample method="POST" path="/v1/persons" body={{ type: "EMPLOYEE", firstName: "Vraj", lastName: "Shah", email: "vraj@example.com", address: { line1: "12 Alkapuri Main Road", city: "Vadodara", state: "GJ", postalCode: "390007", countryCode: "IN" }, compInfo: { type: "salaried", salary: { amount: 20090000, currency: "INR" }, frequency: "monthly", employmentModel: "eor" }, jobInfo: { title: "Software Engineer", startDate: "2026-09-01", employeeNumber: "EMP-101" } }} reference="/api-reference/workforce/persons/create" />

Use the [requirements endpoint](/api-reference/statutory/requirements/list-outstanding-requirements) to loop until nothing is outstanding — under EOR, complete statutory data is a precondition for issuing the employment agreement.

<Note>
  Before setting the worker's payment details, check the jurisdiction's `eor.payoutMethod.walletPayoutAllowed` from step 2 — some countries require salary to be credited to a bank account in the worker's name, so a wallet can't be their payout destination there.
</Note>

## Step 4 — The Employment Agreement

Once the worker's data is complete, the local employment agreement is issued from a country-specific template. Both signing modes are supported — see [Manage Contracts](/workforce/manage-contracts) for the full flows:

* **Electronic signing** — create the contract from a template, then hand each signer a [signing URL](/api-reference/workforce/contracts/signing-url). The business representative signs first, then the worker.
* **Offline signing** — a contract executed outside the platform (for example, wet-signed locally) is [uploaded as a signed PDF](/api-reference/workforce/contracts/upload-contract) and attached to the person's record.

<ApiExample method="GET" path="/v1/contracts" params={{ personId: "{personId}" }} reference="/api-reference/workforce/contracts/list" />

Track progress with the [`contract.created`, `contract.signed`, and `contract.status.updated`](/reference/events) webhook events. Contract issuance can be asynchronous — treat the webhooks, not the create call, as your source of truth for signature state.

<Note>
  EOR employment agreement templates are configured per country with your account manager. The agreement is between the worker and Cadana as the employing entity — your business is referenced as the client the work is performed for.
</Note>

## Step 5 — Worker Account and Verification

Every worker gets a Cadana account. Invite them once their person record exists — the invite email (or a [returnable onboarding link](/wallets/worker-wallets#get-the-onboarding-link), if you deliver it yourself) takes them into the app, where they complete identity and address verification at first sign-in:

<ApiExample method="POST" path="/v1/users/invite" body={{ personId: "{personId}" }} reference="/api-reference/workforce/users/invite" />

If you're embedding the experience in your own product instead, submit verification data directly via the [KYC API](/platform/kyc-verification) and track state with the `user.kyc.updated` webhook. Both paths are covered in [Worker Wallets](/wallets/worker-wallets).

## Step 6 — Fund the Payroll

EOR payrolls debit **gross pay plus employer contributions** from your business balance (direct employment debits net plus fees — see [Employment Models](/workforce/employment-models)). Fund your account ahead of the payroll date and read your balance back at any time:

<ApiExample method="GET" path="/v1/businesses/{businessId}/balances" reference="/api-reference/workforce/treasury/get-balances" />

See [Fund Your Account](/fund-your-account) for deposit methods (bank transfer, direct debit from a linked external account, and sandbox test deposits).

## Step 7 — Run Payroll

Payroll runs identically to direct employment: create, save entries, review the computed `debit`, approve. Follow [Pay an Employee, steps 8–9](/workforce/pay-an-employee#step-8--run-payroll). After completion, the payroll's invoice itemizes the debit into `GROSS_PAYROLL` and `EMPLOYER_CONTRIBUTION` line categories with per-line FX rates.

## Changing Salary or Role

Compensation and job changes go through the job info endpoint — under EOR this also triggers the corresponding employment-agreement update on the Cadana side:

<ApiExample method="PUT" path="/v1/persons/{personId}/jobInfo" body={{ jobInfo: { title: "Senior Software Engineer" }, compInfo: { type: "salaried", salary: { amount: 24000000, currency: "INR" }, frequency: "monthly", employmentModel: "eor" } }} reference="/api-reference/workforce/persons/update-job-information" />

Changes surface on the [`person.updated`](/reference/events#personupdated) webhook. Salary changes apply from the next payroll run that you save.

## Termination and Offboarding

Request offboarding with an exit date and reason — Cadana handles the compliant execution (statutory notice, severance, and final pay under local law):

<ApiExample method="POST" path="/v1/persons/{personId}/offboard" body={{ exitDate: "2027-03-31", reason: "Role eliminated", includeInRegularPayroll: true }} reference="/api-reference/workforce/persons/schedule-offboarding" />

Offboarding is scheduled, not immediate — the worker transitions to `Former` on the exit date, and you can [cancel](/api-reference/workforce/persons/cancel-offboarding) before then or [reinstate](/api-reference/workforce/persons/reinstate) after. The full lifecycle, request fields, and the four `person.offboarding.*` / `person.reinstated` webhook events are covered in [Offboard Workers](/workforce/offboarding-workers).

<Warning>
  Under EOR, local law governs notice periods and severance — an exit date that violates statutory notice can't be executed as requested. Check the jurisdiction's `eor.termination` block (notice scale, severance formula, and process requirements) from [step 2](#step-2--confirm-eor-availability-and-local-employment-rules) when planning termination timing.
</Warning>

## Webhooks to Subscribe To

| Event                                                                             | Fires when                                                 |
| :-------------------------------------------------------------------------------- | :--------------------------------------------------------- |
| `person.created` / `person.updated`                                               | Worker record created / changed (including salary changes) |
| `contract.created` / `contract.signed` / `contract.status.updated`                | Agreement issued / signature collected / status changed    |
| `user.kyc.updated`                                                                | Worker identity verification state changed                 |
| `payroll.status.updated`                                                          | Payroll moved through its lifecycle                        |
| `person.offboarding.scheduled` / `.cancelled` / `.completed`, `person.reinstated` | Termination lifecycle                                      |

See [Webhooks](/reference/webhooks) for setup and [Events](/reference/events) for payloads.

## Next Steps

<CardGroup cols={2}>
  <Card title="Pay an Employee End-to-End" icon="route" href="/workforce/pay-an-employee">
    The shared data-collection and payroll steps in full detail
  </Card>

  <Card title="Employment Models" icon="building-user" href="/workforce/employment-models">
    What the payroll debit collects under EOR vs direct
  </Card>

  <Card title="Manage Contracts" icon="file-signature" href="/workforce/manage-contracts">
    Template-based e-signing and signed-PDF upload
  </Card>

  <Card title="Offboard Workers" icon="user-minus" href="/workforce/offboarding-workers">
    Scheduling, cancelling, reinstating, and webhooks
  </Card>
</CardGroup>
