Complete an issuer onboarding
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Post, RequestUri = new Uri("https://api.flashpi.com.ec/v1/issuer-onboardings/example/complete"), Headers = { { "Authorization", "Bearer <token>" }, }, Content = new StringContent("{ \"ruc\": \"1712345678001\", \"legalName\": \"example\", \"tradeName\": \"example\", \"headOfficeAddress\": \"example\", \"taxProfile\": { \"keepsAccounting\": true, \"specialTaxpayerNumber\": \"5368\", \"withholdingAgentResolution\": \"1\", \"rimpeRegime\": \"entrepreneur\", \"largeTaxpayerResolution\": \"NAC-GCFOIOC21-00000868-E\" }, \"branding\": { \"brandColor\": \"#0f766e\" }, \"sendEmailByDefault\": true }") { Headers = { ContentType = new MediaTypeHeaderValue("application/json") } }};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.flashpi.com.ec/v1/issuer-onboardings/example/complete"
payload := strings.NewReader("{ \"ruc\": \"1712345678001\", \"legalName\": \"example\", \"tradeName\": \"example\", \"headOfficeAddress\": \"example\", \"taxProfile\": { \"keepsAccounting\": true, \"specialTaxpayerNumber\": \"5368\", \"withholdingAgentResolution\": \"1\", \"rimpeRegime\": \"entrepreneur\", \"largeTaxpayerResolution\": \"NAC-GCFOIOC21-00000868-E\" }, \"branding\": { \"brandColor\": \"#0f766e\" }, \"sendEmailByDefault\": true }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.flashpi.com.ec/v1/issuer-onboardings/example/complete")) .header("Authorization", "Bearer <token>") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{ \"ruc\": \"1712345678001\", \"legalName\": \"example\", \"tradeName\": \"example\", \"headOfficeAddress\": \"example\", \"taxProfile\": { \"keepsAccounting\": true, \"specialTaxpayerNumber\": \"5368\", \"withholdingAgentResolution\": \"1\", \"rimpeRegime\": \"entrepreneur\", \"largeTaxpayerResolution\": \"NAC-GCFOIOC21-00000868-E\" }, \"branding\": { \"brandColor\": \"#0f766e\" }, \"sendEmailByDefault\": true }")) .build();HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());const url = 'https://api.flashpi.com.ec/v1/issuer-onboardings/example/complete';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"ruc":"1712345678001","legalName":"example","tradeName":"example","headOfficeAddress":"example","taxProfile":{"keepsAccounting":true,"specialTaxpayerNumber":"5368","withholdingAgentResolution":"1","rimpeRegime":"entrepreneur","largeTaxpayerResolution":"NAC-GCFOIOC21-00000868-E"},"branding":{"brandColor":"#0f766e"},"sendEmailByDefault":true}'};
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.flashpi.com.ec/v1/issuer-onboardings/example/complete \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "ruc": "1712345678001", "legalName": "example", "tradeName": "example", "headOfficeAddress": "example", "taxProfile": { "keepsAccounting": true, "specialTaxpayerNumber": "5368", "withholdingAgentResolution": "1", "rimpeRegime": "entrepreneur", "largeTaxpayerResolution": "NAC-GCFOIOC21-00000868-E" }, "branding": { "brandColor": "#0f766e" }, "sendEmailByDefault": true }'Creates the issuer with the tax profile sent (the same fields as POST /v1/issuers; start from prefill), its establishment 001 at the head office and emission point 001; or, when the account already has the certificate’s RUC (existingIssuer), adds the certificate to that issuer without changing it (the body may be {}). The certificate serves test and live documents and starts processing: retrieve it under the issuer. The tax profile is the customer’s responsibility. Requires an account-scoped (global) API key with read_write access, of either mode: the certificate serves test and live documents.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Header Parameters
Section titled “Header Parameters”Makes the request safe to retry: 1 to 255 visible ASCII characters (a UUID works well), remembered for 24 hours per account and mode. A retry with the same key and the same request returns the first successful response again, with the header Idempotent-Replayed: true. The same key with a different request gets 422 idempotency_key_reused; while the first request still runs, 409 idempotency_key_in_progress. A failed request does not keep its key.
Language of error messages and of the localized texts of resources (SRI messages, failures, certificate rejections): Spanish when the entry with the highest q-value is es or es- plus a region (es-EC, es-419), English otherwise. Errors state it in Content-Language.
Your own ID for the request (letters, digits and -_.:/+=), echoed back in the X-Correlation-Id response header and logged next to the request ID. An invalid value gets 400 invalid_correlation_id.
Request Bodyrequired
Section titled “Request Bodyrequired”The issuer to create, with the same fields as POST /v1/issuers (legalName, headOfficeAddress and taxProfile are required for a new issuer). For a renewal (existingIssuer) the body may be {}: the issuer is not changed (PATCH it if needed).
object
Required when the RUC did not come from the certificate (rucNeedsConfirmation): the proposed RUC or another one whose first 10 digits are the holder’s cédula. Otherwise it may be left out, and must be the certificate’s RUC when sent (422 ruc_mismatch).
Example
1712345678001Razón social.
Nombre comercial.
Dirección matriz.
object
Whether the taxpayer is required to keep accounting (obligado a llevar contabilidad).
Special taxpayer (contribuyente especial) resolution number: 3 to 13 letters or digits.
Example
5368Withholding agent (agente de retención) designation resolution number, digits only. Stored without leading zeros (at most 8 digits).
Example
1RIMPE regime: entrepreneur (CONTRIBUYENTE RÉGIMEN RIMPE) or popular_business (CONTRIBUYENTE NEGOCIO POPULAR - RÉGIMEN RIMPE). Null when not in RIMPE.
Large taxpayer (gran contribuyente) designation resolution number.
Example
NAC-GCFOIOC21-00000868-Eobject
Brand color of the RIDE PDF, #RRGGBB (returned in lowercase).
Example
#0f766eAs in POST /v1/issuers.
Responses
Section titled “Responses”The issuer (created, with establishment 001 and emission point 001, or the existing one for a renewal) and its new certificate, processing until Flashpi onboards it.
object
A taxpayer (RUC) that issues documents.
object
RUC: 13 digits ending in 001 (format only; the check digit is not verified).
Legal name (razón social) as registered in the RUC.
Trade name (nombre comercial).
Head office address (dirección matriz).
Tax profile; Flashpi adds the mandatory tags and legends from it.
object
Whether the taxpayer is required to keep accounting (obligado a llevar contabilidad).
Special taxpayer (contribuyente especial) resolution number: 3 to 13 letters or digits.
Withholding agent (agente de retención) designation resolution number, digits only. Stored without leading zeros (at most 8 digits).
RIMPE regime: entrepreneur (CONTRIBUYENTE RÉGIMEN RIMPE) or popular_business (CONTRIBUYENTE NEGOCIO POPULAR - RÉGIMEN RIMPE). Null when not in RIMPE.
Large taxpayer (gran contribuyente) designation resolution number.
RIDE branding of the issuer.
object
Brand color of the RIDE PDF, #RRGGBB (returned in lowercase).
Default of a document request’s options.sendEmail: true emails every authorized document (RIDE PDF and XML) to its buyer, false opts the issuer out. A request that sets options.sendEmail decides for itself.
An issuer’s .p12 signing certificate. Flashpi checks the upload asynchronously (processing, then accepted or rejected); the file and its password are never returned.
object
Mode of the API key that uploaded it. A certificate of the issuer onboarding serves every mode (allModes): it shows the mode of the API key that reads it.
Whether it serves every mode (test and live): a certificate uploaded through the issuer onboarding (POST /v1/issuer-onboardings). False for one uploaded for one mode.
Whether it signs documents now: accepted, within its validity and not blocked.
Subject distinguished name.
Distinguished name of the certification authority that issued it.
SHA-256 of the certificate, hex.
The RUC found in the certificate, when its authority writes one.
Whether the certification authority revoked the certificate. good: verified not revoked. pending: could not be verified yet; it still signs until blockAt and is checked again hourly. blocked: still unverified after 7 days, or its chain is no longer trusted (blockedReason); it does not sign. revoked: never signs again.
object
Pending only: when it stops signing if still unverified.
Example
{ "issuer": { "id": "01a13eca-2e80-7c3d-9f21-5b8e4a6d0c17", "ruc": "1790000000001", "legalName": "Supermercados La Pradera S.A.", "tradeName": "La Pradera", "headOfficeAddress": "Av. Amazonas N34-12 y Av. Atahualpa, Quito", "taxProfile": { "specialTaxpayerNumber": "5368", "withholdingAgentResolution": "1", "rimpeRegime": "entrepreneur", "largeTaxpayerResolution": "NAC-GCFOIOC21-00000868-E" }, "branding": { "brandColor": "#0f766e" }, "sendEmailByDefault": true }, "certificate": { "environment": "test", "status": "processing", "serialNumber": "4f2a9c01", "ruc": "1790000000001", "revocation": { "status": "good", "blockedReason": "revocation_status_unverified" }, "rejection": { "code": "invalid_password", "message": "The password does not open the .p12 file." } }}Headers
Section titled “Headers”Path of the issuer: /v1/issuers/{issuer.id}. Not sent on an idempotent replay (Idempotent-Replayed: true): build it from the body as shown.
true when this is the stored answer of an earlier request with the same Idempotency-Key (same status and body, no Location). Absent otherwise.
Flashpi’s ID of the request, a UUIDv7 (also requestId in errors). Include it when you contact support.
malformed_json: the body is not valid JSON. bad_request: the body does not decompress with its Content-Encoding. Or invalid_idempotency_key: the Idempotency-Key header is malformed.
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}authentication_required: no Authorization: Bearer header. invalid_api_key: the key is malformed, unknown or revoked.
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}Headers
Section titled “Headers”RFC 6750 challenge: Bearer realm="flashpi", plus error="invalid_token" with invalid_api_key.
The API key cannot perform this operation: key_scope_mismatch, key_read_only or ip_not_allowed; or its account is suspended (account_suspended).
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}Not_found
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}Issuer_onboarding_not_ready (still verifying), issuer_onboarding_rejected, issuer_onboarding_completed, issuer_onboarding_expired, or issuer_already_exists. Or idempotency_key_in_progress: a request with this Idempotency-Key is still running.
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}payload_too_large: the JSON body is larger than 1 MB.
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}unsupported_media_type: the body declares a charset that does not start with utf- (for example latin1, or utf8 without the hyphen) or a Content-Encoding other than gzip, deflate or br.
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}Validation_failed: a field of a new issuer is missing or invalid, ruc is required, or ruc does not match the certificate (ruc_mismatch). Or idempotency_key_reused: the Idempotency-Key was used with a different request.
RFC 9457 problem details, in the language of Content-Language (en, or es with Accept-Language: es). Some codes add extension members, listed below; others may appear.
object
URI of the problem type: the page that documents code, in the language of the response (https://flashpi.com.ec/docs/en/errors/{code} in English, https://flashpi.com.ec/docs/errors/{code} with Accept-Language: es). It changes with the language, so branch on code, never on type.
Localized summary of the type.
HTTP status code.
Localized explanation of this occurrence.
Path of the request.
Stable machine-readable error code, the same in every language. Branch on it, never on type, title or detail. New codes may be added: handle an unknown one by its HTTP status.
Field-level errors (may be empty).
object
Path of the invalid field.
Stable machine-readable reason. New codes may be added: treat an unknown one like invalid_value.
Localized message.
Request ID (UUIDv7); include it when contacting support.
idempotency_key_reused: the document the Idempotency-Key already created.
The daily limit that was reached (email_resend_limit_reached, account_email_limit_reached, demo_issuer_quota_exceeded).
When the daily limit resets: the next midnight in Ecuador (the three codes above and platform_email_limit_reached). Retry-After gives the same in seconds.
ride_not_available: the status of the RIDE.
document_not_authorized: the status of the document.
email_sending_paused: the mode whose email sending is paused.
total_mismatch: the expectedTotal you sent.
total_mismatch: the total Flashpi computed.
Example
{ "type": "https://flashpi.com.ec/docs/en/errors/validation_failed", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid. See errors for details.", "instance": "/v1/invoices", "code": "validation_failed", "errors": [ { "field": "customer.id", "code": "required", "message": "This field is required." } ], "requestId": "017f22e2-79b0-7cc3-98c4-dc0c0c07398f", "rideStatus": "pending", "documentStatus": "processing", "environment": "test", "expectedTotal": "112.00", "computedTotal": "111.99"}