Skip to content

Payment Requests API

API endpoints for the Payment Requests module. All endpoints require JWT authentication (token_admin) and are prefixed with /finances/payment-requests.

Authentication

All endpoints require a valid admin JWT:

Authorization: Bearer <token>

Access is restricted by permission (see Auth column per endpoint).

Endpoints Summary

MethodPathAuthDescription
GET/finances/payment-requestsmenu-payment-requestsList requests (scoped visibility)
GET/finances/payment-requests/{id}menu-payment-requestsGet request detail
POST/finances/payment-requestsmenu-payment-requestsCreate request
PUT/finances/payment-requests/{id}menu-payment-requestsUpdate request
DELETE/finances/payment-requests/{id}menu-payment-requestsDelete pending request
PATCH/finances/payment-requests/{id}/statusvariesTransition status
PATCH/finances/payment-requests/{id}/invoicepayment-requests-manageLink invoice
GET/finances/payment-requests/search/invoicemenu-payment-requestsSearch invoice by UUID
GET/finances/payment-requests/search/providermenu-payment-requestsSearch provider by RFC
GET/finances/payment-requests/catalog/accountsmenu-payment-requestsGet accounts tree
GET/finances/payment-requests/catalog/banksmenu-payment-requestsGet bank catalog
GET/finances/payment-requests/catalog/tax-optionsmenu-payment-requestsGet tax options by receiver
GET/finances/payment-requests/{id}/invoice-taxesmenu-payment-requestsGet invoice tax breakdown

Request Status Values

  • pending — Awaiting review
  • approved — Approved by finance
  • rejected — Rejected by finance (with reason)
  • programmed — Scheduled for payment (with date)
  • paid — Invoice paid (automatic)
  • cancelled — Cancelled

Status Transition Map

CurrentTargetWhoRequired Fields
pendingapprovedFinance (payment-requests-manage)
pendingrejectedFinancerejection_reason
pendingcancelledCreator or Finance
rejectedpendingCreator (resubmit)
rejectedcancelledCreator or Finance
approvedprogrammedFinancepayment_date; items if no linked invoice
approvedcancelledFinance
programmedapprovedFinance (unprogram)
programmedpaidSystem (automatic)
programmedcancelledFinance

GET /finances/payment-requests

List payment requests with scoped visibility and server-side pagination.

  • Users with menu-payment-requests only: returns WHERE created_by = :userId
  • Users with payment-requests-manage: returns all requests

Query Parameters

ParamTypeRequiredDescription
startnumberNoPagination offset (default: 0)
lengthnumberNoPage size (default: 100)
sortBystringNoSort column (default: id)
sortTypestringNoASC or DESC (default: DESC)
statusstringNoFilter by status
searchstringNoSearch by provider name or UUID
startDatestringNoCreated after (YYYY-MM-DD)
endDatestringNoCreated before (YYYY-MM-DD)
receiverIdnumberNoFilter by receiver
accountIdnumberNoFilter by account

Response (200)

json
{
  "success": true,
  "data": [...],
  "recordsTotal": 50,
  "recordsFiltered": 25
}

GET /finances/payment-requests/{id}

Get a single payment request with full detail including event history.

Response (200)

Includes all request fields, joined names (created_by_name, reviewer, programmer), linked invoice status, issuer approval status, bank data, and full event history array.

Errors

CodeDescription
403Not the creator and lacks payment-requests-manage
404Payment request not found

POST /finances/payment-requests

Create a new payment request in pending status.

Payload

FieldTypeRequiredNotes
receiver_idnumberYesFK to zoho_invoice_receivers
provider_namestringYesProvider/vendor name
amountnumberYesPositive, max 2 decimals
signed_form_urlstringYesS3 URL for signed form
invoice_idnumberNoFK to zoho_invoices
issuer_idnumberNoFK to zoho_invoice_issuers
provider_rfcstringNoTax ID for provider search
account_idnumberNoFK to zoho_accounts
citystringNoOffice/city
departmentstringNoDepartment
payment_datestringNoYYYY-MM-DD
conceptstringNoDescription
currencystringNoDerived from locale if omitted
bank_idnumberNoFK to catalog_banks (unapproved providers)
bank_accountstringNoCLABE (unapproved providers)
bank_statement_urlstringNoS3 URL (unapproved providers)
tax_certificate_urlstringNoS3 URL (unapproved providers)
payment_pdf_urlstringNoS3 URL

PATCH /finances/payment-requests/{id}/status

Transition a payment request to a new status. See transition map above.

Payload

FieldTypeRequiredNotes
statusstringYesTarget status
rejection_reasonstringConditionalRequired for rejected
payment_datestringConditionalRequired for programmed (YYYY-MM-DD)
itemsarrayConditionalRequired for programmed when no linked invoice

The items array contains tax breakdown for manual invoice creation:

json
{
  "items": [{
    "name": "Service description",
    "quantity": 1,
    "unitAmount": 12931.03,
    "taxes": [{
      "tax": "002",
      "type": "transfer",
      "amount": 2068.97,
      "zoho_tax_id": "5528319000000416283",
      "factor": { "type": "rate", "amount": 0.16 }
    }]
  }]
}

Side Effects

  • approved: Sets reviewed_by, utc_reviewed_at. Sends Slack DM to creator.
  • rejected: Sets reviewed_by, utc_reviewed_at, rejection_reason. Sends Slack DM to creator with reason.
  • programmed: Sets programmed_by, utc_programmed_at, payment_date. Creates invoice if none linked. Reclassifies existing invoice account. Sends Slack DM to creator with date.
  • cancelled: No additional side effects.

GET /finances/payment-requests/search/invoice

Search for an invoice by UUID. Returns invoice data with issuer/receiver details and checks for existing payment requests.

Query Parameters

ParamTypeRequired
uuidstringYes

Response (200)

json
{
  "success": true,
  "found": true,
  "data": { "id": 456, "uuid": "...", "receiver_name": "...", ... },
  "isPaid": false,
  "hasExistingRequest": false,
  "existingRequest": null
}

GET /finances/payment-requests/catalog/tax-options

Get tax options for a receiver's Zoho organization, grouped by type.

Query Parameters

ParamTypeRequired
receiverIdnumberYes

Response (200)

Returns transferred, retained, retainedGroups, and transferredGroups arrays from zoho_organization_taxes.


GET /finances/payment-requests/{id}/invoice-taxes

Get tax breakdown from the linked invoice's items. Returns parsed items with numeric fields and a calculated summary.


Common Error Responses

Errors follow the Boom format:

json
{
  "statusCode": 400,
  "error": "Bad Request",
  "message": "Descriptive error message"
}
StatusWhen
400Validation failed or invalid business rule
401Missing or invalid JWT
403User lacks required permission
404Resource not found
409Conflict (e.g., duplicate invoice link)

Envia Admin