Skip to main content
POST
Create income invoice

Authorizations

Authorization
string
header
required

Authentication Method: HTTP Bearer token.

The runtime requires the literal Bearer prefix — a bare token in the Authorization header is rejected with 401 unauthorized.

Header Format: Authorization: Bearer YOUR_API_KEY

Your API key is a JWT. Live keys operate on live data (livemode: true); test keys operate on isolated test data (livemode: false).

Get your key at: app.gigstack.pro/settings?tab=api

Errors: credential failures are answered by the authentication layer with a raw { "message": … } body, not the standardized envelope — 401 for a missing, malformed or expired token, 403 for a revoked key or a plan without API access. See the Unauthorized and AuthForbidden responses.

Query Parameters

team
string

gigstack Connect: Target team ID for multi-team access.

Requires gigstack Connect enabled on your team and shared billing account.

Also requires the multipleIssuerAccounts feature on your plan. Requests targeting a team other than the one your API key belongs to return 403 without it.

Only API keys can use it: an OAuth access token sent with another team's id is rejected with 403 Team mismatch with OAuth token.

Optional — omit it entirely unless you are acting on another team. It deliberately carries no example value so generated snippets do not emit ?team=undefined; when the parameter is absent, the team is derived from your API key.

Example: ?team=team_xyz789

Body

application/json

Unknown top-level keys are rejected (400 validation_failed / unexpected_key) — body validation runs in strict allowlist mode, so a field the schema does not declare produces that error. In particular there is no client_id field: reference an existing client with client: { "id": "client_…" }, or look one up with client: { "search": { "on_key": "tax_id", "on_value": "…" } }. Supplying both id and search on the same object is a 400.

team, livemode and owner are reserved and injected by the auth middleware.

client
object
required
currency
string
required
Example:

"MXN"

use
string
required
Example:

"G03"

items
object[]
required
payment_form
enum<string>
required
Available options:
01,
02,
03,
04,
05,
06,
08,
12,
13,
14,
15,
17,
23,
24,
25,
26,
27,
28,
29,
30,
31,
99
Example:

"03"

payment_method
enum<string>
required
Available options:
PPD,
PUE
Example:

"PUE"

date
number
return_files
boolean

Return base64 encoded PDF and XML files in response

Example:

true

exchange_rate
number

Exchange rate for currency conversion. If not provided, the latest rate from our rates collection will be used automatically.

Example:

1

folio_number
number
Example:

123

series
string
Example:

"A"

idempotency_key
string | null

Your identifier for this invoice, for example your order id. With it, sending the same request again cannot issue a second CFDI or charge a second credit:

  • Once the invoice exists, the same key answers 400 with duplicate: true and the existing uuid.
  • While another request with the key is being processed, it answers 409 idempotency_in_progress.
  • After a 503 PAC_OUTCOME_UNKNOWN, a retry with the key resends the exact same XML and folio, so the PAC either stamps it once or reports the stamp it already made.
  • A definitive rejection (for example the SAT refusing the data) frees the key, so you can fix the body and send it again under the same key.

Scoped to your team and the credential's mode. Required on every item of POST /invoices/income/batch.

Example:

"unique_key_123"

exports
enum<string> | null
Available options:
01,
02,
03,
04,
null
Example:

"01"

complements
object[] | null
invoice_pdf_notes
string
Example:

"Additional notes for PDF"

addenda
string | null
Example:

"<addenda>...</addenda>"

send_email
boolean

Whether to send the document via email to the client. Defaults to true.

Example:

true

ignore_emails
boolean | null

Suppress all notification emails for this document. Takes precedence over send_email — when true, no mail is sent even if send_email is true.

Example:

false

emails
string<email>[]
Example:
metadata
object
automation_type
enum<string>

Optional. Invoice automation type:

  • payment: Create invoice with payment automation
  • none: No automation, create invoice only
Available options:
payment,
none
Example:

"payment"

global
object | null

Response

Invoice created successfully

message
string
Example:

"Invoice created successfully"

data
object