Recipe ·Recipe

Check a customer, confirm eligibility, invoice them.
Three entities. Three calls. One key.

This is an illustrative, non-executable example. Service availability, approvals, pricing, and results must be confirmed for your account. you verify their identity with SDAIA, read their employment status from Qiwa, then issue them a tax invoice through ZATCA. Three government entities in one function.

The alternative ·The alternative

What if you connected to each entity directly?

A fair question — and the real alternative isn’t a competitor. The difference isn’t whether the API exists; they all do. It’s how much of it you carry.

Direct, per entityAPI360
Contracts and agreementsThreeOne
Authentication schemesThree different onesOne key
Error shapesThree shapes to learnOne standard shape
Monthly invoicesThreeOne
A trial environment before contractingVaries — and may not existOne unified sandbox
When an entity changes its APIYou find out from the outageA published 60-day notice

And we won’t hide the other side: connecting directly removes an intermediary and gives you a direct relationship with the entity. If you consume only one API and don’t intend to add more, the gap is narrower than it looks.

The three calls ·The three calls

step by step.

1

Verify the identity SDAIA

The ID number and date of birth come back with a matching name and validity status. The full ID isn’t stored in your record — only the reference and the outcome.

POST /v1/identity/verifyIllustrative only
2

Read the employment status Qiwa

With the data subject’s consent: employer and contract status. Enough for a financing eligibility or credit-limit decision — with no payslip and no documents.

GET /v1/employment/statusIllustrative only
3

Issue the invoice ZATCA

A phase-two compliant tax invoice, signed and reported. It comes back with uuid and a print-ready QR code.

POST /v1/zatca/einvoiceIllustrative only
Prices and execution results are intentionally omitted because this example is not an approved executable demo.
The code ·The code

The whole recipe.

// استخدم مفتاح البيئة المفعّلة في حسابك
const api = new API360({ key: process.env.API360_KEY });

async function onboard(nationalId, dob) {
  // 1 — SDAIA
  const id = await api.identity.verify({ national_id: nationalId, date_of_birth: dob });
  if (!id.verified) throw new Error('IDENTITY_MISMATCH');

  // 2 — Qiwa
  const job = await api.employment.status({ national_id: nationalId });

  // 3 — ZATCA
  const inv = await api.zatca.einvoice({
    customer: { name: id.full_name_ar, vat_number: job.employer_vat },
    lines: [{ description: 'مثال توضيحي', amount: '<example>' }]
  });

  return { verified: id.verified, employer: job.employer_name_ar, invoice: inv.uuid };
}
What you don’t see in the code: Retrying when an entity stumbles, normalising the error shape, and logging every call for audit — the platform does all of it below the line. Connect directly and you’d write it three times.

You might also want

Browse the other APIs →