---
title: "Issue certificates from one CSV (or JSON rows): one sealed, signed PDF per payee × period × ATC. A row issued before returns the ORIGINAL document id (no new certificate). 409 names the revision when the form is stale. Response: ZIP of the new PDFs + register.csv (?format=json: the register only)"
method: POST
path: "/api/v1/certificates"
tags: ["Certificates"]
---

# Issue certificates from one CSV (or JSON rows): one sealed, signed PDF per payee × period × ATC. A row issued before returns the ORIGINAL document id (no new certificate). 409 names the revision when the form is stale. Response: ZIP of the new PDFs + register.csv (?format=json: the register only)

`POST /api/v1/certificates`

## Request

- Base URL: `https://philforms.com`
- URL: `https://philforms.com/api/v1/certificates`
- Auth: HTTP bearer

## Query parameters

- `form` 'bir-2307' | 'bir-2316'
- `quarter` string
- `year` string
- `format` 'json'

## Request body

- object
  - `form` 'bir-2307' | 'bir-2316'
  - `quarter` string
  - `year` string
  - `row` object[]
  - `csv` string
  - `payor` object: Values keyed by parameter name
  - `employer` object: Values keyed by parameter name

## Response `201`

ZIP of PDFs + manifest.json

## Other responses

- `400`: A row is invalid (named)
- `402`: Needs a paid plan or credits (test keys are free, marked)
- `409`: The form is stale — names the revision

---

[API](https://skmtc.dev/philforms/apis/philforms-api.md) · [All operations](https://skmtc.dev/philforms/apis/philforms-api/llms.txt) · [OpenAPI document](https://skmtc.dev/philforms/apis/philforms-api/revisions/a43bf313729c?raw)
