A read API over the resettlement record
Your PAP register, entitlement matrix, payments and grievances, over HTTP, with a key scoped to the projects you name. For lenders pulling portfolio status, agencies reconciling against their own systems, and consultants building a matrix somewhere else.
Authentication
One header. The key is hashed on arrival and is never written to a log, including when the request fails.
curl -H "Authorization: Api-Key sk_live_xxxxxxxx" \
"https://api.smartlarms.com/api/v1/partner/entitlement-matrix/?project=<project-id>" Every key carries two independent filters: the organisation it belongs to, and the explicit list of projects it may read. Both always apply. A request for a project outside that list returns 403 with the reason stated — not an empty result, which would read as "no data" and send someone looking for a bug that is not there.
Endpoints
https://api.smartlarms.com/api/v1/partner
| Method | Path | Scope | Returns |
|---|---|---|---|
| GET | /projects/ | — | Projects this key is permitted to read. |
| GET | /paps/ | paps | The PAP register. Cursor-paginated. Filters: project, since, until. |
| GET | /entitlement-matrix/ | matrix | Entitlement matrix rows for a project. JSON or CSV. Filters: project, impact_category, tenure_status. |
| GET | /payments/ | payments | Recorded compensation payments. Filters: project, since, until. |
| GET | /grievances/ | grievances | Grievance register. Filters: project, status, category. |
| GET | /reports/excel/ | reports | Generated .xlsx workbook: register, payments, grievances or summary. |
Asking for a specific format
The entitlement matrix endpoint takes ?format=json or ?format=csv, because two different things ask for a matrix. A system reconciling one wants JSON and pagination. A consultant assembling a RAP annex wants a file that opens.
# The whole matrix as a spreadsheet
curl -H "Authorization: Api-Key sk_live_xxxxxxxx" \
"https://api.smartlarms.com/api/v1/partner/entitlement-matrix/?project=<id>&format=csv" \
-o entitlement-matrix.csv
# Or as JSON, one page at a time
curl -H "Authorization: Api-Key sk_live_xxxxxxxx" \
"https://api.smartlarms.com/api/v1/partner/entitlement-matrix/?project=<id>&impact_category=loss_of_crops"JSON
Cursor-paginated. Codes and human labels both returned, so you do not have to duplicate our choice lists and watch them drift. Money as decimal strings, never floats.
CSV
Fixed column order, every field quoted, UTF-8 with a BOM so Excel on Windows does not mangle accented text. Whole matrix in one response.
Four decisions worth knowing about
- v1 is read-only. The register is a system of record, and an integration that can change a compensation figure without the change being attributed to a person defeats the reason the register exists. Writes go through the application.
- Cursor pagination, not page numbers. Partners sync while the register is being edited. Offset pagination silently skips and repeats rows when that happens.
- Every request is logged. Who read what, when, and how many records — because a register of named households is being read by an outside system, and that should be answerable.
- The PAP endpoint withholds field narrative. Socio-economic notes, vulnerability detail and grievance text describe named individuals and are not exposed through an integration. A partner who needs them for a case can ask, and the ask leaves a record.
Rate limits
| Tier | Reads / hr | Reports / hr |
|---|---|---|
| Standard | 1,000 | 20 |
| Extended | 5,000 | 100 |
Counted separately: a workbook costs far more to serve than a list page, and routine polling should not be able to exhaust the allowance a monthly report depends on.
Questions
- Is there an API for resettlement or RAP data?
- Yes. SmartLARMS exposes a versioned REST API over the project register, entitlement matrix, payments and grievances. It authenticates with a per-client API key, is scoped to the projects that key is permitted to read, and returns JSON or CSV. It is read-only in v1 — the system of record is written through the application, so an integration cannot alter a compensation figure without leaving the audit trail the register exists to keep.
- How do I authenticate?
- Send the key in an Authorization header as 'Api-Key sk_live_…'. The key is hashed on arrival and never logged, including on failure. Each key carries a set of scopes and an explicit list of projects it may read; both filters always apply, so a key cannot reach another tenant's data or a project it was not granted.
- Can I request a specific data format?
- The entitlement matrix endpoint takes ?format=json or ?format=csv. JSON is cursor-paginated for systems that sync; CSV returns the whole matrix in one response with a fixed column order, quoted fields and a UTF-8 BOM so it opens correctly in Excel. The reports endpoint returns .xlsx for recipients who will open a workbook rather than parse a feed.
- Why is pagination cursor-based rather than page numbers?
- Because partners sync large registers on a schedule while the register is being edited. Offset pagination silently skips or repeats rows when the underlying data changes between pages, which a partner experiences as records that never sync and cannot reproduce. Cursors are stable across concurrent edits.
- What are the rate limits?
- Standard keys allow 1,000 reads and 20 report generations per hour; extended keys allow 5,000 and 100. Reads and reports are counted separately, because a workbook is far more expensive to serve than a list page and routine polling should not be able to exhaust the allowance a report depends on.
- How do I get a key?
- Keys are issued per client organisation and scoped to named projects, so they are set up rather than self-served. Contact us with the projects the integration needs to read and what it will do with the data.
Getting a key
Keys are issued per organisation and scoped to named projects, so they are set up rather than self-served. Tell us which projects the integration needs to read and what it will do with the data.