curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/invoices/string/duplicate" \ -H "Authorization: Bearer $FLUIDE_ACCESS_TOKEN" \ -H "X-Fluide-Api-Key: $FLUIDE_API_KEY" \ -H "X-Fluide-Client-Id: fluide-developer" \ -H "X-Workspace-Id: $FLUIDE_WORKSPACE_ID" \ -H "X-Acting-Company-Id: $FLUIDE_COMPANY_ID"const baseUrl = process.env.FLUIDE_BASE_URL; const response = await fetch(`${baseUrl}/api/v1/invoices/string/duplicate`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.FLUIDE_ACCESS_TOKEN}`, 'X-Fluide-Api-Key': process.env.FLUIDE_API_KEY, 'X-Fluide-Client-Id': 'fluide-developer', 'X-Workspace-Id': process.env.FLUIDE_WORKSPACE_ID, 'X-Acting-Company-Id': process.env.FLUIDE_COMPANY_ID, },
}); if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());import os
import requests base_url = os.environ["FLUIDE_BASE_URL"]
headers = { "Authorization": f"Bearer {os.environ['FLUIDE_ACCESS_TOKEN']}", "X-Fluide-Api-Key": os.environ["FLUIDE_API_KEY"], "X-Fluide-Client-Id": "fluide-developer", "X-Workspace-Id": os.environ["FLUIDE_WORKSPACE_ID"], "X-Acting-Company-Id": os.environ["FLUIDE_COMPANY_ID"],
} response = requests.post( f"{base_url}/api/v1/invoices/string/duplicate", headers=headers, timeout=30,
)
response.raise_for_status()
print(response.json())import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse; String baseUrl = System.getenv("FLUIDE_BASE_URL");
HttpClient client = HttpClient.newHttpClient();
HttpRequest.Builder builder = HttpRequest.newBuilder() .uri(URI.create(baseUrl + "/api/v1/invoices/string/duplicate")) .header("Authorization", "Bearer " + System.getenv("FLUIDE_ACCESS_TOKEN")) .header("X-Fluide-Api-Key", System.getenv("FLUIDE_API_KEY")) .header("X-Fluide-Client-Id", "fluide-developer") .header("X-Workspace-Id", System.getenv("FLUIDE_WORKSPACE_ID")) .header("X-Acting-Company-Id", System.getenv("FLUIDE_COMPANY_ID")) .POST(HttpRequest.BodyPublishers.noBody()) .build();
HttpResponse<String> response = client.send(builder.build(), HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) throw new RuntimeException("HTTP " + response.statusCode() + ": " + response.body());
System.out.println(response.body());<?php
$baseUrl = getenv("FLUIDE_BASE_URL");
$ch = curl_init($baseUrl . "/api/v1/invoices/string/duplicate");
curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('FLUIDE_ACCESS_TOKEN'), 'X-Fluide-Api-Key: ' . getenv('FLUIDE_API_KEY'), 'X-Fluide-Client-Id: fluide-developer', 'X-Workspace-Id: ' . getenv('FLUIDE_WORKSPACE_ID'), 'X-Acting-Company-Id: ' . getenv('FLUIDE_COMPANY_ID'), ],
]);
$response = curl_exec($ch);
if ($response === false) throw new RuntimeException(curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status >= 400) throw new RuntimeException("HTTP $status: $response");
echo $response;{
"organizationId": "<string>",
"companyId": "<string>",
"invoiceNumber": "<string>",
"kind": "STANDARD",
"customerId": "<string>",
"projectId": "<string>",
"clientId": "<string>",
"issueDate": "2023-11-07T05:31:56Z",
"dueDate": "2023-11-07T05:31:56Z",
"subtotal": 123,
"taxAmount": 123,
"total": 123,
"currency": "<string>",
"status": "DRAFT",
"settlementStatus": "UNPAID",
"amountPaid": 123,
"balanceDue": 123,
"postedAt": "2023-11-07T05:31:56Z",
"postedBy": "<string>",
"postedJournalEntryId": "<string>",
"notes": "<string>",
"sourceDocumentIds": [
"<string>"
],
"documentBranding": {
"displayName": "<string>",
"logoUrl": "<string>",
"primaryColor": "<string>",
"accentColor": "<string>",
"footerText": "<string>",
"locale": "<string>"
},
"sentByEmail": "<string>",
"lineItems": [
{
"invoiceId": "<string>",
"invoice": "<unknown>",
"lineNumber": 123,
"description": "<string>",
"quantity": 123,
"unitPrice": 123,
"discountAmount": 123,
"taxAmount": 123,
"lineTotal": 123,
"glAccountId": "<string>",
"taxCodeId": "<string>",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"allocations": [
{
"invoiceId": "<string>",
"invoice": "<unknown>",
"fluidePayTransactionId": "<string>",
"paymentSource": "FLUIDEPAY",
"externalReference": "<string>",
"evidenceDocumentIds": [
"<string>"
],
"allocatedAmount": 123,
"currency": "<string>",
"allocatedAt": "2023-11-07T05:31:56Z",
"allocatedBy": "<string>",
"memo": "<string>",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"creditNotes": [
{
"organizationId": "<string>",
"companyId": "<string>",
"creditNoteNumber": "<string>",
"invoiceId": "<string>",
"invoice": "<unknown>",
"amount": 123,
"currency": "<string>",
"reason": "<string>",
"status": "DRAFT",
"postedAt": "2023-11-07T05:31:56Z",
"postedBy": "<string>",
"postedJournalEntryId": "<string>",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}Duplicate invoice into a new draft
curl -sS -X POST "$FLUIDE_BASE_URL/api/v1/invoices/string/duplicate" \ -H "Authorization: Bearer $FLUIDE_ACCESS_TOKEN" \ -H "X-Fluide-Api-Key: $FLUIDE_API_KEY" \ -H "X-Fluide-Client-Id: fluide-developer" \ -H "X-Workspace-Id: $FLUIDE_WORKSPACE_ID" \ -H "X-Acting-Company-Id: $FLUIDE_COMPANY_ID"const baseUrl = process.env.FLUIDE_BASE_URL; const response = await fetch(`${baseUrl}/api/v1/invoices/string/duplicate`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.FLUIDE_ACCESS_TOKEN}`, 'X-Fluide-Api-Key': process.env.FLUIDE_API_KEY, 'X-Fluide-Client-Id': 'fluide-developer', 'X-Workspace-Id': process.env.FLUIDE_WORKSPACE_ID, 'X-Acting-Company-Id': process.env.FLUIDE_COMPANY_ID, },
}); if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());import os
import requests base_url = os.environ["FLUIDE_BASE_URL"]
headers = { "Authorization": f"Bearer {os.environ['FLUIDE_ACCESS_TOKEN']}", "X-Fluide-Api-Key": os.environ["FLUIDE_API_KEY"], "X-Fluide-Client-Id": "fluide-developer", "X-Workspace-Id": os.environ["FLUIDE_WORKSPACE_ID"], "X-Acting-Company-Id": os.environ["FLUIDE_COMPANY_ID"],
} response = requests.post( f"{base_url}/api/v1/invoices/string/duplicate", headers=headers, timeout=30,
)
response.raise_for_status()
print(response.json())import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse; String baseUrl = System.getenv("FLUIDE_BASE_URL");
HttpClient client = HttpClient.newHttpClient();
HttpRequest.Builder builder = HttpRequest.newBuilder() .uri(URI.create(baseUrl + "/api/v1/invoices/string/duplicate")) .header("Authorization", "Bearer " + System.getenv("FLUIDE_ACCESS_TOKEN")) .header("X-Fluide-Api-Key", System.getenv("FLUIDE_API_KEY")) .header("X-Fluide-Client-Id", "fluide-developer") .header("X-Workspace-Id", System.getenv("FLUIDE_WORKSPACE_ID")) .header("X-Acting-Company-Id", System.getenv("FLUIDE_COMPANY_ID")) .POST(HttpRequest.BodyPublishers.noBody()) .build();
HttpResponse<String> response = client.send(builder.build(), HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) throw new RuntimeException("HTTP " + response.statusCode() + ": " + response.body());
System.out.println(response.body());<?php
$baseUrl = getenv("FLUIDE_BASE_URL");
$ch = curl_init($baseUrl . "/api/v1/invoices/string/duplicate");
curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('FLUIDE_ACCESS_TOKEN'), 'X-Fluide-Api-Key: ' . getenv('FLUIDE_API_KEY'), 'X-Fluide-Client-Id: fluide-developer', 'X-Workspace-Id: ' . getenv('FLUIDE_WORKSPACE_ID'), 'X-Acting-Company-Id: ' . getenv('FLUIDE_COMPANY_ID'), ],
]);
$response = curl_exec($ch);
if ($response === false) throw new RuntimeException(curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status >= 400) throw new RuntimeException("HTTP $status: $response");
echo $response;{
"organizationId": "<string>",
"companyId": "<string>",
"invoiceNumber": "<string>",
"kind": "STANDARD",
"customerId": "<string>",
"projectId": "<string>",
"clientId": "<string>",
"issueDate": "2023-11-07T05:31:56Z",
"dueDate": "2023-11-07T05:31:56Z",
"subtotal": 123,
"taxAmount": 123,
"total": 123,
"currency": "<string>",
"status": "DRAFT",
"settlementStatus": "UNPAID",
"amountPaid": 123,
"balanceDue": 123,
"postedAt": "2023-11-07T05:31:56Z",
"postedBy": "<string>",
"postedJournalEntryId": "<string>",
"notes": "<string>",
"sourceDocumentIds": [
"<string>"
],
"documentBranding": {
"displayName": "<string>",
"logoUrl": "<string>",
"primaryColor": "<string>",
"accentColor": "<string>",
"footerText": "<string>",
"locale": "<string>"
},
"sentByEmail": "<string>",
"lineItems": [
{
"invoiceId": "<string>",
"invoice": "<unknown>",
"lineNumber": 123,
"description": "<string>",
"quantity": 123,
"unitPrice": 123,
"discountAmount": 123,
"taxAmount": 123,
"lineTotal": 123,
"glAccountId": "<string>",
"taxCodeId": "<string>",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"allocations": [
{
"invoiceId": "<string>",
"invoice": "<unknown>",
"fluidePayTransactionId": "<string>",
"paymentSource": "FLUIDEPAY",
"externalReference": "<string>",
"evidenceDocumentIds": [
"<string>"
],
"allocatedAmount": 123,
"currency": "<string>",
"allocatedAt": "2023-11-07T05:31:56Z",
"allocatedBy": "<string>",
"memo": "<string>",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"creditNotes": [
{
"organizationId": "<string>",
"companyId": "<string>",
"creditNoteNumber": "<string>",
"invoiceId": "<string>",
"invoice": "<unknown>",
"amount": 123,
"currency": "<string>",
"reason": "<string>",
"status": "DRAFT",
"postedAt": "2023-11-07T05:31:56Z",
"postedBy": "<string>",
"postedJournalEntryId": "<string>",
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}
],
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"deletedAt": "2023-11-07T05:31:56Z"
}Authorizations
Access token JWT. Use as Authorization: Bearer . In the API playground, paste the JWT only.
Developer API key (fl_dev_...). Required on every API call with a machine access token.
First-party client audience. Must match the fluide_client_id claim on the JWT. Use fluide-developer for Connect.
Headers
Partner / ISV only: UUID of the workspace that owns the client company. Required together with X-Acting-Company-Id when scoping product APIs to a merchant. See /getting-started/multi-tenancy.
Partner / ISV only: UUID of the client company to act on. Must belong to the workspace in X-Workspace-Id.
Path Parameters
Response
Subsidiary / company for multi-entity AR. Null only for legacy rows before this column existed.
STANDARD, PROFORMA, CREDIT_NOTE, DEBIT_NOTE, DOWN_PAYMENT Project accounting dimension (optional).
Client / sub-ledger dimension (optional).
DRAFT, POSTED, SENT, VIEWED, PARTIALLY_PAID, PAID, OVERDUE, CANCELLED UNPAID, PARTIALLY_PAID, PAID When set, the invoice has been posted to the ledger and must not be edited directly.
Show child attributes
Show child attributes
Email of the user who last sent the invoice (issuer notification fallback).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes