- Approved: Sintropix creates the person’s payable Invoice in a Source that holds Expense Renditions, and books it in the same request. From then on it’s an Expense Rendition like any other, and you pay it from a Payment Batch.
- Rejected: the claim keeps the reason, and the decision is final. To try again, submit a new claim.
approved, with no wait for the Approver.
While a claim waits, it is no Invoice. It isn’t listed among the Expense Renditions or in Compras, isn’t a payable to plan in a Payment Batch, and doesn’t count on the home dashboard.
Concepts
- Person. The Partner who paid the expense and is paid back, never the merchant.
- Receipt Kind. What the person holds as proof: a
boletaor afacturaissued to the Entity. It decides what the approval debits. See What approving books. - Expense Category. What the expense was spent on, such as “Alimentación” or “Movilización”. Each Entity names its own categories, and each category can carry the expense account its claims propose. See Expense Categories.
- Proposed expense account. The expense account the claim suggests: the account of the claim’s category, or one the submitter names. It must be an account of type
cost_of_goods_sold,operating_expense, orother_expense. The Approver can pick another one on approval. - Number. Each claim takes the next number of its Entity when you submit it: 1, 2, 3, and so on. Numbers never repeat within an Entity. The Expense Rendition of an approved claim carries it as its Document Number,
R-<number>, so a claim reads the same before and after approval. - Approver. The one User of the Organization who approves and rejects the claims of all its Entities. It must be a member with the
clientRole: someone of the client’s own team, never Sintropix staff or aviewer. The Approver role ends when the User’s Membership ends. - Status. Sintropix derives it, and never stores it:
submitted: the claim waits for the Approver.approved: the claim has its Expense Rendition, ininvoiceId.rejected: the claim has arejectionReason.
Before you submit claims
Approving needs two settings. Set them in Configuración → Rendiciones, at/{entityId}/settings/expense-claims, or through the API:
- The Approver of the Organization. Use
PUT /organizations/:organizationId/expense-claim-approver. - The booking setting of each Entity. Use
PUT /expense-claim-setting. It names three things:- The Source the Expense Renditions land in. It must be a Source that holds Expense Renditions.
- The Rendición por pagar account, which the approval credits with the person as Partner. It must be a
liabilityaccount with the sub-typeexpense_rendition_payable. If the Entity already books renditions into apayableaccount, you can switch its sub-type toexpense_rendition_payableeven though it has entries. - The supplier payable account, which a
facturaclaim debits. It must have the sub-typepayable, and it must be the account the Entity’s SII invoices credit, so that you can match the two lines later.
409 and SOURCE_PINNED_ERROR. Each account also keeps its sub-type while the setting names it: a change is refused with 409 and LEDGER_ACCOUNT_FACT_PINNED_ERROR. To change any of them, set another one first.
Report a rendition to Erwin
A person can also report a rendition to Erwin, for example in a Slack channel bound through an Agent Channel: “pagué un almuerzo con cliente con mi tarjeta, ¿me lo devuelven?”. Erwin submits it as an Expense Claim, and the Approver approves or rejects it like any other claim. Erwin never approves, rejects, or books the claim himself.- Erwin checks the setup. When the Entity has no booking setting or the Organization has no Approver, Erwin submits nothing. He tells you that Rendiciones isn’t set up yet, and that someone who keeps the books sets it in Configuración → Rendiciones.
- He gets the facts. Erwin asks for a proof if you sent none: a photo, a receipt, or a screenshot. He reads the date, the merchant, and the amount from it, and asks only for what it doesn’t show. The amount is what the Entity pays back, in its functional currency. When the proof is in another currency, he asks what was charged to you in the functional currency, as your card statement shows it. The claim is a
facturawhen the proof is a factura electrónica issued to the Entity’s RUT, and aboletaotherwise, including when there’s no document. - He submits the claim. The person who paid is the claim’s Partner, never the merchant. Erwin creates the Partner when there’s none. The
memoholds the merchant, what the expense was, and the other facts the Approver needs, such as the payment method, the document number, and the original currency and amount. A claim holds no file, so when you report it from Slack, the memo ends with a link to the Slack message that holds the proof. - He proposes what it was spent on. Erwin names an Expense Category when one clearly fits the expense and has an expense account. Otherwise he proposes an expense account, following your Organization’s practices in his wiki. He never creates a category, and the Approver can book to another account.
What approving books
Approving creates onepayable Invoice and books it in the same request:
The booking entry is dated on the expense date. Its Control Line credits the Rendición por pagar account with the person as Partner. The debit depends on the Receipt Kind:
For a
factura, the claim keeps the expense account as the suggestion for booking the SII invoice. The debit to the supplier payable stays open until you settle it against the Control Line of the SII invoice with POST /ledger/allocations/match. The SII invoice then reads as paid.
If you unbook the Expense Rendition and delete it, the claim loses its invoiceId and is submitted again.
Access
A
viewer who writes receives 403 with PERMISSION_DENIED_ERROR. Anyone but the Approver who approves or rejects receives 403 with EXPENSE_CLAIM_NOT_APPROVER_ERROR, even a staff member. See Access and roles.
The Expense Claim object
POST /expense-claims
Submit an Expense Claim. It starts as submitted, with the next number of its Entity.
Body
Send exactly one of
expenseCategoryId and expenseAccountId. A body with both, or with neither, receives 400.
In the app, Nueva rendición asks for a Categoría, and the picker shows each category’s account or Sin cuenta asignada. A category without an account is refused, and the dialog keeps your draft so you can assign the account in Configuración → Rendiciones and submit again.
Response (201): the Expense Claim object.
GET /expense-claims
List the Entity’s Expense Claims, newest expense first. Claims with the same expenseDate come in a stable order.
Query parameters
Response
GET /expense-claims/:expenseClaimId
Read one Expense Claim.
Response: the Expense Claim object. An unknown id receives 404 with EXPENSE_CLAIM_NOT_FOUND_ERROR.
POST /expense-claims/:expenseClaimId/approve
Approve a submitted claim. Sintropix creates its Expense Rendition and books it, as What approving books describes. Only the Approver can call it.
Body
Response (
200)
POST /expense-claims/:expenseClaimId/reject
Reject a submitted claim. The rejection is final. Only the Approver can call it.
Body
Response (
200): the Expense Claim object, now rejected.
Expense Categories
An Expense Category names what an expense was spent on, such as “Alimentación”, “Movilización”, or “Hospedaje”. Each Entity keeps its own list. A category can carry an expense account: a claim that names the category proposes that account, so the submitter picks what the expense was, not where it books.- A category’s name is unique within its Entity. Sintropix trims surrounding spaces, so
" Taxi "and"Taxi"are one name. - A category starts with no account. Assign one before a claim names it.
- You can rename a category and assign it another account, but you can’t clear an account once it’s assigned.
- The account must be an expense account of the Entity: of type
cost_of_goods_sold,operating_expense, orother_expense. - You can delete a category while no Expense Claim names it. Once a claim names it, whatever the claim’s status, the category stays: rename it instead.
The Expense Category object
GET /expense-categories
GET /api/entities/:entityId/expense-categories
List the Entity’s Expense Categories, in name order.
Response: an array of Expense Category objects.
POST /expense-categories
POST /api/entities/:entityId/expense-categories
Create an Expense Category.
Body
Response (
201): the Expense Category object.
PATCH /expense-categories/:expenseCategoryId
PATCH /api/entities/:entityId/expense-categories/:expenseCategoryId
Rename a category, assign its expense account, or both. Send at least one field. A field you omit keeps its value. Claims already submitted keep the account they proposed.
Body
Response (
200): the Expense Category object. An unknown id receives 404 with EXPENSE_CATEGORY_NOT_FOUND_ERROR.
DELETE /expense-categories/:expenseCategoryId
DELETE /api/entities/:entityId/expense-categories/:expenseCategoryId
Delete a category that no Expense Claim names, such as one created by mistake. The call has no body.
- A category that any Expense Claim names, whatever the claim’s status, is refused with
409andEXPENSE_CATEGORY_IN_USE_ERROR. The category and its claims stay as they are. Rename the category instead. - An unknown id receives
404withEXPENSE_CATEGORY_NOT_FOUND_ERROR.
A category that an expense Feed brought comes back the next time the Feed reads an expense of that category. It returns with no expense account, so the expense is rejected with
expense_category_unassigned until you assign one again. In the app, the delete confirmation of such a category says so.200): the deleted Expense Category object.
GET /expense-claim-setting
Read the Entity’s booking setting.
Response
PUT /expense-claim-setting
Create or replace the Entity’s booking setting. A change applies to the claims you approve after it. Expense Renditions already created keep their Source and booking.
Body
An account without the right sub-type receives
400 with EXPENSE_CLAIM_SETTING_ACCOUNT_INELIGIBLE_ERROR. Its params.role says which one: rendition_payable or supplier_payable.
Response: the same shape as GET /expense-claim-setting.
GET /organizations/:organizationId/expense-claim-approver
Read the Organization’s Approver, and the members offered as one.
Response
approver and each element of candidates carry userId (uuid), name (string), and email (string).
PUT /organizations/:organizationId/expense-claim-approver
Set or change the Organization’s Approver. The new Approver decides every claim that still waits, in every Entity of the Organization.
Body
Response: the same shape as
GET /organizations/:organizationId/expense-claim-approver.
Status codes
Domain error codes
A Merge of Partners moves the merged Partner’s claims to the kept one.

