Create an end user
Try itPOST /v1/end-users
This request changes data. It runs for real against the QuickBooks Desktop company file of the end user you choose. Use a test key (sk_test_) and a test company file.
const url = 'https://api.desktopaccountingapi.com/v1/end-users';const options = { method: 'POST', headers: { 'Idempotency-Key': '6f1c2a0e-1f7e-4c55-9a7a-0b2d2c9e3a10', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"companyName":"Acme Supply","sourceId":"cust_8812","email":"ops@acme.example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.desktopaccountingapi.com/v1/end-users \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: 6f1c2a0e-1f7e-4c55-9a7a-0b2d2c9e3a10' \ --data '{ "companyName": "Acme Supply", "sourceId": "cust_8812", "email": "ops@acme.example" }'Creates an end user: one of your customers, mapped to one QuickBooks Desktop company file. Next, create an auth session so the end user can connect QuickBooks. sourceId must be unique within the project.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Makes a write safe to retry. Repeating a key with the same request attaches to or replays the original instead of creating a second one. 1–255 printable ASCII characters, retained 7 days. Reusing a key with a different request returns 422 IDEMPOTENCY_KEY_REUSED.
Example
6f1c2a0e-1f7e-4c55-9a7a-0b2d2c9e3a10Request Bodyrequired
Section titled “Request Bodyrequired”object
The end user’s company name, shown in the setup flow. 1–255 characters.
Example
Acme SupplyYour identifier for this end user, unique within the project. 1–255 characters.
Example
cust_8812Contact email for your identification. We never email end users.
Example
ops@acme.exampleResponses
Section titled “Responses”The created end user.
object
Unique identifier for the end user.
Always end_user.
When the end user was created. UTC, ISO 8601 with milliseconds.
The end user’s company name, shown in the setup flow.
Your identifier for this end user. Unique within the project.
Contact email, for your identification only. We never email end users.
QuickBooks Desktop connections. Empty until the first auth session is created; at most one in v1.
object
Unique identifier for the connection.
Always integration_connection.
When the connection was created. UTC, ISO 8601 with milliseconds.
The integration this connection uses.
Derived connection status. pending_setup: no Web Connector has finished setup. online: the Web Connector checked in recently and the last QuickBooks session opened. quickbooks_unavailable: the Web Connector checks in but QuickBooks could not be opened (statusReason holds the error code). company_file_mismatch: a different company file is open. offline: no recent check-in. disabled: turned off by the developer.
Code explaining a non-online status, when known: an error code (for example QBD_ACCESS_NOT_GRANTED), QBD_QUICKBOOKS_NOT_RESPONDING (the Web Connector checks in but QuickBooks does not answer, usually because a dialog is open) or WEB_CONNECTOR_SCHEDULE_CHANGED.
When the last request for this connection was made. UTC, ISO 8601.
When the last request succeeded. UTC, ISO 8601.
When the Web Connector last checked in. UTC, ISO 8601.
The connected company file, once a session has opened.
object
Company name reported by QuickBooks.
QuickBooks product and version reported by QuickBooks.
QbXML version used with this company file.
QuickBooks edition country.
Example
{ "id": "eu_01j9x4m6v4c8k2t7q0r5s3w1zb", "objectType": "end_user", "createdAt": "2026-10-05T16:03:59.002Z", "companyName": "Acme Supply", "sourceId": "cust_8812", "email": "ops@acme.example", "integrationConnections": [ { "id": "conn_01j9x4m6v4c8k2t7q0r5s3w1zc", "objectType": "integration_connection", "createdAt": "2026-10-05T16:03:59.002Z", "integrationSlug": "quickbooks_desktop", "status": "pending_setup", "statusReason": "QBD_QUICKBOOKS_NOT_RESPONDING", "companyFile": { "product": "QuickBooks Enterprise Solutions: General Business 24.0", "qbxmlVersion": "16.0", "country": "US" } } ]}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
The request is invalid. Codes: UNKNOWN_HEADER, INVALID_JSON, INVALID_PARAMETER, UNKNOWN_PARAMETER, IDEMPOTENCY_KEY_INVALID.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.
The API key is missing or invalid. Codes: API_KEY_MISSING, API_KEY_INVALID.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.
The operation is not permitted. Codes: API_KEY_READ_ONLY.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.
The request body is too large. Codes: PAYLOAD_TOO_LARGE.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.
The request is well formed but cannot be processed. Codes: IDEMPOTENCY_KEY_REUSED.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.
Too many requests. Codes: RATE_LIMITED.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.
Unexpected server error. Codes: INTERNAL_ERROR.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.
QuickBooks Desktop or the service is not available. Codes: SERVICE_UNAVAILABLE.
object
object
Error category. Use it to choose between retrying, fixing the request and asking the end user to act.
Stable error code from the error catalog. New codes may be added; a code’s meaning never changes.
Developer-facing explanation. May include IDs and field paths; never includes secrets.
A message that is safe to show to the end user.
HTTP status of the response. null for codes that appear only on a request resource (REQUEST_EXPIRED, REQUEST_CANCELED).
Native QuickBooks code when one exists: a qbXML statusCode ("3200"), an HRESULT ("0x80040414") or a Web Connector code.
The Daapi-Request-Id of this response. Include it when contacting support.
Why this error happens.
Ordered actions that resolve the error, each with the responsible actor.
object
Who can apply the fix.
What to do.
Documentation section for this code.
Repeating the identical request (with the same Idempotency-Key for writes) can succeed without changes. Also sent as the Daapi-Should-Retry header.
Whether a write took effect: applied (QuickBooks confirmed it), not_applied (it certainly did not happen), pending (sent, still processing), unknown (sent, result could not be confirmed) or not_applicable (a read).
Request field, query parameter or header the error refers to, when known.
Code-specific details, documented per code in the error catalog.
object
Example
{ "error": { "type": "INVALID_REQUEST_ERROR", "code": "INVALID_JSON", "httpStatusCode": 503, "integrationCode": "0x80040414", "requestId": "req_01j9x4m6v4c8k2t7q0r5s3w1zd", "fixes": [ { "actor": "developer" } ], "docsUrl": "https://www.desktopaccountingapi.com/docs/errors/#qbd_modal_dialog_open", "outcome": "applied", "param": "companyName" }}Headers
Section titled “Headers”Unique ID of this API call (req_...). Present on every response.
Requests allowed per window for the project (all keys together).
Requests left in the current window, as counted by the edge location that served this call.
Seconds until the current window resets.
true when repeating the identical request can succeed. SDKs follow it instead of status-code heuristics.
Seconds to wait before retrying, on 429 and on retryable 503 responses when a wait is known.