Create purchase order

Creates a new purchase order to track purchase commitments before invoices are received. This endpoint handles three types of purchase orders with comprehensive validation and automatic folio generation.

Purchase Order Types

1. Against Invoice

Single invoice purchase order with exactly one item at 100%.

Use case: Simple purchases with a single invoice expected.

Example: Purchasing office equipment for $10,000 CLP.

2. By Milestone

Multiple named deliverables with individual percentages.

Use case: Projects with defined stages and separate invoicing for each stage.

Example: Software project with Design (30%), Development (50%), Testing (20%).

3. By Percentage

Multiple payment stages with percentages (no names required).

Use case: Service contracts with payment schedule.

Example: Consulting service with 30% advance, 50% mid-project, 20% final payment.

Prerequisites

Before creating a purchase order, you need:

  1. Business Partner: The vendor/supplier for this purchase

    • Must be pre-registered and approved
    • Find partners: GET /v1/erp/payouts/business_partners
  2. Company: The company making the purchase

    • User must be a member with appropriate role
    • Required roles: admin, owner, or member

Validation Rules

General Rules (All Types)

  • amount_cents: Must be positive integer (in cents)
  • description: Required field for purchase reference
  • currency: Must be one of: CLP, UF, USD
  • items: Must have at least one item
  • percentages: Item percentages must sum to exactly 100%

Type-Specific Rules

AgainstInvoice:

  • Must have exactly 1 item
  • Item percentage must be 100%
  • Item name is optional (not required)

ByMilestone:

  • Must have at least 1 item
  • Each item must have a name
  • Item percentages must sum to 100%

ByPercentage:

  • Must have at least 2 items
  • Item names are optional (not required)
  • Item percentages must sum to 100%

Automatic Features

Folio Generation

System automatically generates a folio: a per-company sequential integer
(1, 2, 3, ...), unique within the company. It is not a formatted string.

Item Amount Calculation

System automatically calculates item amounts based on percentages:

  • Formula: item.amount_cents = (total_amount_cents × percentage / 100).round
  • Automatically recalculated when total amount changes

Creator Tracking

System automatically assigns current authenticated user as creator (user_id).

Workflow

  1. Purchase order is created with status draft
  2. Admin/creator assigns reviewers to items (if approval required)
  3. Reviewers approve or reject items independently
  4. When fiscal invoice arrives, it's linked to approved items
  5. Linked items can be paid via bank transactions
  6. When all items are paid, purchase order is considered complete

Important Notes

  • Regular users can only create purchase orders for companies they are members of
  • All amounts are in the smallest currency unit (cents for CLP)
  • Item amounts are automatically calculated from percentages
  • Full audit trail is maintained for all changes
Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Body Params

Purchase order details including type, business partner, amount, currency, and items

purchase_order
object
required
Headers
uuid
required

UUID of the company on whose behalf the request is made. Required for every Pay endpoint.
See The company-id header for details on how to obtain
a value for this header and the error responses to expect when it is missing or invalid.

If the deprecated company_id query parameter is also sent, both values must match;
the API returns 422 Unprocessable Entity when they disagree.

Responses

401

Unauthorized — missing/invalid Authorization, or the caller is not authorized
to create a purchase order for this company (Pundit policy). The response body
is empty
for this guard (Pundit renders nothing). Branch your client logic on
the status code, not the body. A bad/unknown company-id header resolves to a
404, not a 401. See Errors for details.

Language
Credentials
Bearer
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json