# Error codes

Source: https://parasend.com/docs/errors

Every error: `{"error": {type, code, message, param, request_id}}`. `type` sets the HTTP status; `code` is the exact cause.

| Code | Status | Type | Cause |
|---|---|---|---|
| `account_deletion_not_scheduled` | 409 | conflict | No deletion is scheduled. |
| `account_deletion_scheduled` | 403 | permission_error | A deletion is already scheduled. |
| `account_not_found` | 404 | not_found | No account with that ID. |
| `address_patch_state_invalid` | 409 | conflict | The delivery has moved on too far for its postal address to be changed. |
| `admin_host_only` | 403 | permission_error | The staff admin answers only on its own address. |
| `already_reminded` | 409 | conflict | This request has been reminded already. |
| `api_key_expired` | 401 | authentication_error | The API key has passed its expiry date. Make a new key in the portal. |
| `api_key_invalid` | 401 | authentication_error | The API key is not one Parasend issued: check for a typo or a missing part. |
| `api_key_ip_not_allowed` | 403 | permission_error | This API key may not be used from this IP address. |
| `api_key_missing` | 401 | authentication_error | Authentication required. |
| `api_key_revoked` | 401 | authentication_error | This API key has been revoked. |
| `approval_already_requested` | 409 | conflict | This person has an open request already. Remind them instead. |
| `approval_request_closed` | 409 | conflict | This request is no longer open. |
| `approval_request_expired` | 409 | conflict | This request has expired. |
| `approval_request_not_found` | 404 | not_found | No such approval request. |
| `auth_assurance_insufficient` | 403 | permission_error | The recipient's electronic ID does not reach the level this delivery requires. Use another method. |
| `auth_attempts_exhausted` | 403 | permission_error | Too many failed attempts; try again after 24 hours. |
| `auth_cancelled_by_user` | 400 | invalid_request | The authentication was cancelled. |
| `auth_method_incompatible` | 409 | conflict | An authentication method you allowed cannot assert the identity this delivery requires. |
| `auth_method_not_offered` | 400 | invalid_request | The portal signs in with audkenni or smart_id. |
| `auth_method_unknown` | 400 | invalid_request | method is not a known authentication method. |
| `auth_not_complete` | 409 | conflict | The identity provider has not finished the authentication yet; try again in a moment. |
| `auth_provider_unavailable` | 503 | api_error | This person has no personal code on file to confirm with. |
| `bank_claim_not_available` | 400 | invalid_request | Bank claims are for Icelandic organisations; pay by card. |
| `batch_add_limit_exceeded` | 400 | invalid_request | Too many deliveries in one call. Send at most 1,000 per call, as many calls as you need. |
| `batch_closed` | 409 | conflict | The batch is closed and takes no more deliveries. |
| `batch_empty_finalize` | 400 | invalid_request | This batch has no deliveries yet; add some before sending it out. |
| `batch_finalized` | 409 | conflict | This batch has been sent out; it takes no more deliveries. Start a new batch, or duplicate this one. |
| `batch_not_found` | 404 | not_found | No batch with that ID, in the mode of your key. |
| `billing_country_locked` | 409 | conflict | This account has been invoiced in another country, so its country cannot change. Contact Parasend Support. |
| `billing_setup_required` | 403 | permission_error | All free deliveries are used. To keep sending, move to Pay-as-you-go and add a card in the portal. |
| `body_invalid` | 400 | invalid_request | The request body could not be parsed. |
| `brand_asset_not_found` | 404 | not_found | No brand asset with that ID. |
| `brand_asset_reference_invalid` | 400 | invalid_request | A logo, photo or icon the brand profile names is not your organisation's, or not of the right kind. |
| `brand_profile_archived` | 409 | conflict | This brand profile is archived; create a new one instead. |
| `brand_profile_not_found` | 404 | not_found | No brand profile with that ID. |
| `break_glass_limit` | 400 | invalid_request | At most two admins besides the owner can sign in with eID while SSO is required. |
| `break_glass_not_admin` | 400 | invalid_request | Only admins can be named (the owner always can sign in with eID). |
| `card_declined` | 400 | invalid_request | The card was declined. Try another card. |
| `card_mandate_changed` | 409 | conflict | The card authorisation has changed. Read it again before accepting. |
| `card_mandate_required` | 400 | invalid_request | Accept the card authorisation before adding a card. |
| `card_not_saved` | 400 | invalid_request | Teya does not know this card check. |
| `card_payment_in_progress` | 409 | conflict | A payment of this invoice is already under way. Wait a moment and look again. |
| `card_payments_not_available` | 400 | invalid_request | Card payments are not available here yet. |
| `card_payments_not_enabled` | 503 | api_error | Saving cards is not switched on for Parasend at the card processor yet. Try again later. |
| `card_processor_unavailable` | 503 | api_error | The card processor did not answer. Try again in a moment. |
| `card_session_failed` | 409 | conflict | This card was not saved. Open the card form again. |
| `card_session_not_found` | 404 | not_found | No such card session. |
| `card_session_pending` | 409 | conflict | The card check is not finished yet. Try again in a moment. |
| `certificate_language_fixed` | 409 | conflict | A delivery's certificate is in the language the company had set when it was sent; the other language is refused. |
| `company_account_required` | 409 | conflict | A personal account has no company to verify. |
| `company_already_registered` | 409 | conflict | This company already has a Parasend account. Ask its owner to invite you. |
| `company_application_already_approved` | 409 | conflict | This request has already been approved. |
| `company_application_closed` | 409 | conflict | This application is no longer open. |
| `company_application_not_found` | 404 | not_found | No such company application. |
| `company_application_pending` | 409 | conflict | You have asked for a new account for this company. Cancel that application first. |
| `company_approval_not_found` | 404 | not_found | This approval link is not valid. |
| `company_approval_not_yours` | 403 | permission_error | This request is for someone else. |
| `company_closed` | 409 | conflict | The company registry lists this company as closed. |
| `company_not_found` | 404 | not_found | No company with this code in the company registry. |
| `company_registry_not_connected` | 503 | api_error | The company registry is not connected yet. |
| `company_registry_unavailable` | 503 | api_error | The company registry did not answer. Try again in a moment. |
| `confirmation_mismatch` | 400 | invalid_request | Type the company's name exactly as it is shown. |
| `confirmation_required` | 409 | conflict | Give an e-mail address for the account; a code confirms it. |
| `contrast_validation_failed` | 400 | invalid_request | A colour pair does not reach the contrast of 4.5:1. `message` names the pair. |
| `country_fixed_by_eid` | 400 | invalid_request | The billing country comes from your electronic ID. |
| `country_not_supported` | 400 | invalid_request | Company sign-up is for Icelandic companies for now. |
| `credential_missing` | 500 | api_error | The signed-in session has no credential to issue from. |
| `csrf_token_invalid` | 403 | permission_error | This request needs the Parasend-CSRF header of your current session. |
| `cursor_invalid` | 400 | invalid_request | The provided cursor is not valid. |
| `delete_already_scheduled` | 409 | conflict | Deletion is already scheduled for this delivery. |
| `delete_blocked_legal_hold` | 409 | conflict | The delivery is under legal hold and cannot be deleted. The message names the case reference, when there is one. |
| `delivery_already_confirmed` | 409 | conflict | The recipient has already confirmed receipt; revocation is not possible. |
| `delivery_expired` | 409 | conflict | The delivery has already expired. |
| `delivery_link_expired` | 401 | authentication_error | This delivery link has expired. |
| `delivery_link_invalid` | 404 | not_found | This delivery link is not valid. |
| `delivery_link_wrong_host` | 409 | conflict | This delivery opens on its own address; the page moves there. |
| `delivery_not_found` | 404 | not_found | No delivery with that ID that you may see, in the mode of your key. |
| `delivery_revoked` | 409 | conflict | The delivery is already revoked. |
| `delivery_state_invalid` | 409 | conflict | This delivery has been confirmed or has ended; its follow-ups no longer change. |
| `delivery_too_large` | 400 | invalid_request | The files of one delivery add up to more than a delivery may hold. |
| `delivery_visibility_insufficient` | 403 | permission_error | Webhook endpoints get events for every delivery in the organisation, so managing them needs a key or member that sees all deliveries. |
| `document_not_found` | 404 | not_found | No shared document with that ID. |
| `document_personal_code_missing` | 403 | permission_error | This document does not show a kennitala. Use electronic ID, or an Icelandic passport or ID card. |
| `domain_exists` | 409 | conflict | Your organisation already has this domain. |
| `domain_not_found` | 404 | not_found | No such domain. |
| `domain_not_verified` | 409 | conflict | Verify at least one e-mail domain first: discovery works only on verified domains. |
| `domain_public_mail` | 400 | invalid_request | This is a public mail service: anyone can have an address there, so it cannot be verified for an organisation. |
| `eid_sign_in_required` | 403 | permission_error | You are listed for this company: confirm with your electronic ID to open its account. |
| `email_already_registered` | 409 | conflict | This address already has a Parasend account. Sign in instead. |
| `email_disposable` | 400 | invalid_request | Disposable addresses cannot be used. Use your own address. |
| `email_in_use` | 409 | conflict | This address belongs to another Parasend account. Sign in to that one, or use another address. |
| `email_not_confirmed` | 409 | conflict | Confirm this address first (POST /v1/portal/emails). |
| `email_required` | 409 | conflict | Confirm an e-mail address for the account first (POST /v1/portal/emails). |
| `email_sender_confirmation_not_found` | 404 | not_found | This link is not valid any more. Send a new test e-mail from Parasend. |
| `email_sender_domain_claimed` | 409 | conflict | Another organisation on Parasend uses this domain. |
| `email_sender_exists` | 409 | conflict | Your organisation already has this e-mail sender. |
| `email_sender_in_use` | 409 | conflict | A brand profile uses this e-mail sender. Choose another sender there, or archive the profile, first. |
| `email_sender_mail_from_invalid` | 400 | invalid_request | `mail_from_domain` must be a subdomain of the sending domain that nobody sends or receives mail at. |
| `email_sender_not_found` | 404 | not_found | No e-mail sender with that ID. |
| `email_sender_not_smtp` | 400 | invalid_request | This sender goes through Parasend; only an SMTP sender has a server. |
| `email_sender_public_domain` | 400 | invalid_request | Notices can go only from your organisation's own domain, not from a public mail provider. |
| `email_sender_removed` | 409 | conflict | This sender was removed; add it again to use it. |
| `email_sender_reserved` | 400 | invalid_request | Parasend's own domains cannot be a company's sender. |
| `email_sender_secret_not_deleted` | 500 | api_error | The sender's password could not be deleted just now; nothing was removed. Try again. |
| `event_not_found` | 404 | not_found | No event with that ID, in the mode of your key. |
| `expiry_extension_invalid` | 400 | invalid_request | expires_at must be in the future. |
| `file_deleted` | 404 | not_found | The sender has deleted their account; its documents no longer exist. |
| `file_not_found` | 404 | not_found | No such file in this delivery. |
| `file_reference_invalid` | 400 | invalid_request | A file the request names does not exist, or is not yours. |
| `file_too_large` | 413 | payload_too_large | The file is larger than a direct upload allows (32 MB). |
| `free_daily_cap_reached` | 429 | rate_limited | Free transactions have a daily limit, and it is reached. Choose a plan to send more today. |
| `free_sms_destination_not_covered` | 400 | invalid_request | Free transactions include SMS to Iceland and some countries only. Choose a plan to send SMS to this country. |
| `gateway_return_unknown` | 404 | not_found | No sign-in is waiting for this return, or its time is over. |
| `gender_wording_unavailable` | 403 | permission_error | Your organisation may not use the gender word in its wordings. `message` says why. |
| `governance_company_only` | 403 | permission_error | Shared documents are for company accounts. |
| `governance_document_shared` | 409 | conflict | This shared document has been shared and cannot be changed this way. |
| `governance_file_blocked` | 409 | conflict | The file did not pass the malware check and cannot be downloaded. |
| `governance_file_too_large` | 413 | invalid_request | The shared document is larger than allowed. |
| `governance_not_connected` | 503 | api_error | Shared documents are not connected yet. |
| `governance_not_your_upload` | 403 | permission_error | Only the person who uploaded this file can do this. |
| `governance_quota_exceeded` | 409 | conflict | The company's shared documents have used their space. Remove files you no longer need. |
| `governance_restore_unavailable` | 404 | not_found | Nothing to restore: the version is not removed, or more than 30 days have passed. |
| `governance_scan_pending` | 409 | conflict | The file is still being checked for malware. Try again in a minute. |
| `icon_not_square` | 400 | invalid_request | The icon is not square. |
| `icon_svg_unsafe` | 400 | invalid_request | The SVG holds something an icon may not, such as a script or an external link. Export it as a plain SVG, or upload a PNG. |
| `icon_too_large` | 413 | invalid_request | The icon is larger than 1 MB. |
| `icon_too_small` | 400 | invalid_request | The icon is smaller than 180 × 180 pixels. |
| `icon_type_unsupported` | 415 | invalid_request | Send the icon as the request body, as image/png or image/svg+xml. |
| `idempotency_key_invalid` | 400 | invalid_request | Idempotency-Key must be 1-255 characters of [A-Za-z0-9_-]. |
| `idempotency_key_missing` | 400 | invalid_request | POST requests require an Idempotency-Key header. |
| `idempotency_key_reused` | 409 | conflict | This Idempotency-Key was already used with a different request body. |
| `identifier_invalid` | 400 | invalid_request | The test sign-in takes a personal code, not a phone number. |
| `identity_already_verified` | 409 | conflict | Your identity is already verified with eID. |
| `identity_document_not_verified` | 403 | permission_error | The passport or ID-card check did not pass. Try again, or choose another way. |
| `identity_mismatch` | 403 | permission_error | The verified identity does not satisfy the authentication condition set by the sender for this delivery. |
| `identity_proofing_coming_soon` | 503 | api_error | The passport check is coming soon. |
| `identity_proofing_not_connected` | 503 | api_error | Identity proofing with an ID document is not connected yet. |
| `identity_proofing_not_found` | 404 | not_found | No such identity proofing. |
| `identity_proofing_unavailable` | 503 | api_error | Identity proofing did not answer. Try again in a moment. |
| `identity_verification_conflict` | 409 | conflict | This personal code belongs to another member of a team you are in. Contact support@parasend.com. |
| `identity_verification_expired` | 409 | conflict | This verification has ended. Start a new one. |
| `identity_verification_failed` | 409 | conflict | The verification was cancelled. |
| `identity_verification_mismatch` | 409 | conflict | This electronic ID belongs to someone else. Use your own. |
| `identity_verification_not_found` | 404 | not_found | No such identity verification. |
| `identity_verification_pending` | 409 | conflict | Confirm on your phone first. |
| `identity_verification_required` | 403 | permission_error | Verify your identity with an electronic ID or a passport check before choosing a service plan. |
| `image_too_detailed` | 400 | invalid_request | The photo cannot be made small enough for the page. Choose a calmer photo or crop it. |
| `image_too_large` | 413 | invalid_request | The photo can be at most 5 MB. |
| `image_too_small` | 400 | invalid_request | The photo is smaller than 640 × 320 pixels. |
| `image_type_unsupported` | 415 | invalid_request | The photo must be a JPEG (image/jpeg), PNG (image/png) or WebP (image/webp). |
| `internal_error` | 500 | api_error | Something went wrong on our side. Try again; if it keeps happening, contact us with the `request_id`. |
| `invalid_parameter_value` | 400 | invalid_request | A parameter has a value the API does not accept. `param` names it, and `message` says what is allowed. |
| `invitation_cancelled` | 409 | conflict | This invitation has been cancelled. |
| `invitation_expired` | 409 | conflict | This invitation has expired. Ask for a new one. |
| `invitation_not_found` | 404 | not_found | No such invitation. |
| `invitation_not_pending` | 409 | conflict | The invitation is no longer open and can no longer be cancelled. |
| `invitation_pending` | 409 | conflict | This address already has an open invitation: resend it instead. |
| `invitation_used` | 409 | conflict | This invitation has already been used. |
| `invitation_wrong_person` | 403 | permission_error | This invitation is for someone else: only the person it names can accept it. |
| `invoice_not_found` | 404 | not_found | No such invoice. |
| `invoice_not_payable` | 409 | conflict | Only an unpaid card invoice whose charge was refused is paid here. |
| `invoice_pdf_not_available` | 404 | not_found | This invoice has no PDF: it is test data, or Payday has not booked it yet. |
| `join_request_cooldown` | 409 | conflict | Your last request to join was declined. You can ask again later. |
| `join_request_not_found` | 404 | not_found | No such join request. |
| `join_request_not_pending` | 409 | conflict | This request has expired. |
| `join_request_pending` | 409 | conflict | You have already asked to join; the request is waiting for an answer. |
| `key_decisions_required` | 400 | invalid_request | The member holds API keys: decide for each whether to roll, keep or delete it. |
| `key_delete_holder_only` | 403 | permission_error | Only the person the key is bound to, or the account owner, can delete it. |
| `key_holder_only` | 403 | permission_error | Only the person this key is bound to can change who sees the deliveries it sends. |
| `key_holder_unavailable` | 409 | conflict | No member can take over these keys. |
| `key_holder_unidentified` | 409 | conflict | A key can be handed only to a member who has signed in to this organisation with eID. Choose another member. |
| `key_recent_use_unconfirmed` | 409 | conflict | The key was used recently. Confirm that you want to delete it: whatever uses it will stop working. |
| `key_reveal_issuer_only` | 403 | permission_error | Only the person this key is bound to can reveal it. |
| `key_reveal_not_available` | 409 | conflict | A live key is shown only once, when it is created or rolled. Roll it to get a new one. |
| `key_secret_unavailable` | 409 | conflict | This key's secret is not stored. Roll it to get a new one you can reveal later. |
| `limit_invalid` | 400 | invalid_request | `limit` must be a whole number within the range the endpoint allows. |
| `link_domain_unavailable` | 409 | conflict | Your brand profile's link domain is not working, so this delivery's links would be on Parasend's own address. Send with `options.allow_parasend_links: true`, or fix the domain. `error.link_domain` names it. |
| `livemode_not_available` | 409 | conflict | This organisation has no access to live data yet. |
| `logo_svg_unsafe` | 400 | invalid_request | The SVG holds something a logo may not, such as a script or an external link. Export it as a plain SVG, or upload a PNG. |
| `logo_too_large` | 413 | invalid_request | The logo can be at most 1 MB. |
| `logo_type_unsupported` | 415 | invalid_request | Send the logo as the request body, as image/png or image/svg+xml. |
| `malformed_json` | 400 | invalid_request | The request body is not valid JSON, or not the JSON object the endpoint expects. |
| `member_already_active` | 409 | conflict | This person is already a member of the organisation. |
| `member_limit_reached` | 409 | conflict | This team is full: every seat on the organisation's plan is taken. |
| `member_not_found` | 404 | not_found | No member with that ID in your organisation. |
| `member_not_manageable` | 403 | permission_error | This member holds rights you do not hold, so you cannot change or remove them. |
| `member_role_from_groups` | 409 | conflict | This member's role comes from their groups in your identity provider: change it there. Their permissions and the deliveries they see can still be changed here. |
| `member_self_edit` | 403 | permission_error | You cannot change your own role, permissions or visibility; another member who manages the team can. |
| `membership_required` | 403 | permission_error | You are no longer a member of this organisation. |
| `metadata_too_large` | 400 | invalid_request | `metadata` has more keys or longer values than allowed. |
| `minimum_loa_unsatisfiable` | 400 | invalid_request | conditional_authentication requires verification_level high or substantial. |
| `missing_required_parameter` | 400 | invalid_request | A required parameter is missing. `param` names it. |
| `monthly_delivery_cap_exceeded` | 429 | rate_limited | This API key has reached its monthly cap of deliveries. The count starts again at the start of next month. |
| `nickname_invalid` | 400 | invalid_request | A card's name is up to 40 characters, on one line. |
| `not_found` | 404 | not_found | No such route. |
| `organization_already_verified` | 409 | conflict | This account is verified already. |
| `organization_closed` | 409 | conflict | This account is being deleted. |
| `organization_deletion_not_scheduled` | 409 | conflict | No deletion is under way. |
| `organization_deletion_scheduled` | 403 | permission_error | This company account is being deleted. Cancel the deletion to use it again, or switch to another account. |
| `organization_not_found` | 404 | not_found | No such account. |
| `organization_not_selected` | 409 | conflict | Choose an organisation first (PATCH /v1/portal/session). |
| `organization_verification_pending` | 403 | permission_error | A verification of this account is already waiting. Open it to follow it. |
| `owner_cannot_leave` | 409 | conflict | The owner cannot leave the organisation: transfer ownership to another member first. |
| `owner_only` | 403 | permission_error | Only the owner can transfer ownership. |
| `owner_or_admin_required` | 403 | permission_error | Only the account owner or an admin can verify the company. |
| `owner_protected` | 403 | permission_error | Nobody is invited as owner: ownership changes only by a transfer. |
| `owner_required` | 403 | permission_error | Only the account owner can delete the account. |
| `ownership_transfer_expired` | 409 | conflict | This transfer has expired. Ask the owner to start it again. |
| `ownership_transfer_not_found` | 404 | not_found | No such ownership transfer. |
| `ownership_transfer_not_pending` | 409 | conflict | This transfer of ownership is no longer waiting for an answer. |
| `ownership_transfer_pending` | 409 | conflict | A transfer of ownership is already waiting for approval. Cancel it first. |
| `ownership_transfer_target_only` | 403 | permission_error | Only the member ownership is being transferred to can approve it. |
| `parameter_invalid` | 400 | invalid_request | A parameter has a value the API does not accept. `param` names it. |
| `parameter_missing` | 400 | invalid_request | A required parameter is missing. `param` names it. |
| `passkey_already_registered` | 409 | conflict | This passkey is already registered. |
| `passkey_attestation_invalid` | 400 | invalid_request | attestation must be the WebAuthn registration response (PublicKeyCredential.toJSON()). |
| `passkey_below_level` | 403 | permission_error | This passkey was set up with an e-mail address. Confirm with your eID, or a passkey set up after an eID sign-in. |
| `passkey_challenge_invalid` | 400 | invalid_request | challenge_id is the one /v1/portal/passkeys/options returned. |
| `passkey_enrolment_not_allowed` | 409 | conflict | A passkey can be added here only right after confirming receipt with your eID (within 10 minutes). |
| `passkey_last_one` | 409 | conflict | This is your only passkey and your only way to sign in. Add another before removing it. |
| `passkey_limit_reached` | 409 | conflict | You have as many passkeys as allowed. Remove one before adding another. |
| `passkey_not_available` | 409 | conflict | No passkey is available for this confirmation. Confirm with your electronic ID instead. |
| `passkey_not_found` | 404 | not_found | No such passkey. |
| `passkey_not_recognised` | 401 | authentication_error | This passkey is not recognised here. Sign in with your eID instead. |
| `passkey_rate_limited` | 429 | rate_limited | Too many failed passkey sign-ins. Wait a while or sign in with your eID. |
| `passkey_sign_in_expired` | 409 | conflict | This sign-in has expired or was already used. Start a new one. |
| `passkey_user_verification_required` | 400 | invalid_request | The device did not verify you (Face ID, fingerprint or PIN). Try again. |
| `passport_check_coming_soon` | 409 | conflict | The passport check is coming soon; until then a delivery can be bound to a kennitala (recipient.personal_code) only. |
| `payment_method_is_primary` | 409 | conflict | This card is the primary card. Make another card the primary first. |
| `payment_method_merchant_only` | 409 | conflict | An Apple Pay card is charged automatically each month and cannot pay an invoice here. Use a card, or add one. |
| `payment_method_not_found` | 404 | not_found | No such card. |
| `payment_method_required` | 409 | conflict | Add a card before choosing to pay by card. |
| `payment_overdue` | 402 | permission_error | Sending is paused: this account has unpaid invoices over its limit. Pay them in the portal (Service plan and billing) and sending opens again at once. |
| `permission_denied` | 403 | permission_error | The API key or member does not have the permission this needs. `param` names it, as resource.action. |
| `permission_exceeds_issuer` | 403 | permission_error | You cannot grant webhooks: webhook endpoints receive events for every delivery, and you see only your own. |
| `personal_account` | 409 | conflict | A personal account has no team: this is for company accounts. |
| `personal_account_exists` | 409 | conflict | You have started a new personal account since; this one cannot be opened again. |
| `photo_consent_required` | 422 | invalid_request | Agree that a photo of your passport's photo page and your selfie are kept with this delivery's evidence and shown to its sender (photo_consent: true) before the passport check starts. |
| `picture_too_large` | 413 | invalid_request | The picture can be at most 5 MB. |
| `picture_type_unsupported` | 415 | invalid_request | The picture must be a JPEG, PNG or WebP image. |
| `pin_invalid_for_scheme` | 400 | invalid_request | `personal_code` must be a 10-digit kennitala, and `id_document_number` a passport or ID-card number. |
| `pin_type_incompatible_method` | 400 | invalid_request | None of the requested methods can assert the declared identity condition. |
| `pin_type_required` | 400 | invalid_request | pin_type is required whenever pin is set. |
| `pipedrive_deal_missing` | 409 | conflict | This account has no Pipedrive deal yet. |
| `plan_change_by_agreement` | 409 | conflict | Plan 1–3 are by written agreement: starting on one, or moving between Pay-as-you-go and Plan 1–3. Contact sales@parasend.com. |
| `plan_change_by_contract` | 409 | conflict | Enterprise is agreed by contract. Contact sales@parasend.com to change it. |
| `plan_change_by_parasend` | 409 | conflict | This account's plan is set by Parasend. Contact sales@parasend.com to change it. |
| `plan_required` | 403 | permission_error | The Trust center is included in Plan 1–3 and Enterprise. |
| `policy_archived` | 409 | conflict | This follow-up policy is archived; duplicate it or create a new one instead. |
| `policy_in_use` | 409 | conflict | The follow-up policy is still used by open batches or pending deliveries. Move them to another policy first. |
| `policy_not_found` | 404 | not_found | No follow-up policy in use with that ID. |
| `policy_not_resettable` | 400 | invalid_request | Only Parasend's own policies can be reset; this one is your organisation's. |
| `policy_override_choice_required` | 409 | conflict | Some pending deliveries follow their own policy. Say whether to keep them (`own_policy_deliveries: keep`) or switch them too. |
| `policy_override_not_allowed` | 400 | invalid_request | This batch uses one follow-up policy for every delivery; leave options.reminder_policy out, or ask the batch's owner to allow overrides. |
| `policy_sms_too_long` | 400 | invalid_request | The reminder text is too long: with the sender's name and the link, it must fit in one SMS. |
| `policy_step_invalid` | 400 | invalid_request | A step of the policy is not valid: its channel, its timing or its wording. |
| `policy_step_out_of_range` | 400 | invalid_request | The step number is outside the policy's steps. |
| `portal_beta_invite_only` | 403 | permission_error | Parasend is in a closed beta: sign-in is by invitation only. |
| `portal_session_expired` | 401 | authentication_error | The portal session has ended. Sign in again. |
| `portal_session_missing` | 401 | authentication_error | Sign in to the portal first. |
| `portal_session_required` | 403 | permission_error | Only a person signed in to the portal can do this; an API key cannot. |
| `portal_sign_in_blocked` | 429 | rate_limited | Too many failed sign-ins. Try again after 24 hours. |
| `portal_sign_in_cancelled` | 409 | conflict | This sign-in was cancelled. Start a new one. |
| `portal_sign_in_expired` | 409 | conflict | This sign-in has already been used. Start a new one. |
| `portal_sign_in_failed` | 401 | authentication_error | This sign-in failed. Start a new one. |
| `portal_sign_in_not_found` | 404 | not_found | No such sign-in. |
| `portal_sign_in_pending` | 409 | conflict | Confirm the sign-in on your phone first. |
| `price_list_not_found` | 404 | not_found | There is no price list in effect for that plan and date. |
| `rail_not_available` | 400 | invalid_request | That plan cannot be paid that way. |
| `rate_limit_exceeded` | 429 | rate_limited | Too many requests of this kind. Wait the number of seconds in the `Retry-After` header, then try again. |
| `rate_limited` | 429 | rate_limited | Too many requests. Try again shortly. |
| `reauthentication_cancelled` | 409 | conflict | The eID confirmation was cancelled. |
| `reauthentication_expired` | 409 | conflict | This confirmation expired. Start a new one. |
| `reauthentication_failed` | 401 | authentication_error | The eID confirmation did not succeed. |
| `reauthentication_not_found` | 404 | not_found | No such eID confirmation. |
| `reauthentication_pending` | 409 | conflict | Confirm on your phone first. |
| `reauthentication_required` | 403 | permission_error | This needs a fresh sign-in. Confirm with your electronic ID or passkey, then try again. |
| `reauthentication_wrong_person` | 403 | permission_error | This passkey is not the person signed in. Confirm with your own. |
| `recipient_domain_apex` | 400 | invalid_request | A link domain is a subdomain, such as afhending.fyrirtaeki.example: the domain itself cannot point at Parasend with a CNAME. |
| `recipient_domain_claimed` | 409 | conflict | Another organisation on Parasend uses this domain. |
| `recipient_domain_exists` | 409 | conflict | Your organisation already has this link domain. |
| `recipient_domain_in_use` | 409 | conflict | A brand profile uses this link domain. Choose another domain there, or archive the profile, first. |
| `recipient_domain_not_found` | 404 | not_found | No link domain with that ID. |
| `recipient_domain_removed` | 409 | conflict | This domain was removed; add it again to use it. |
| `recipient_domain_reserved` | 400 | invalid_request | Parasend's own domains cannot be a link domain. |
| `recipient_domain_too_long` | 400 | invalid_request | The host name is too long for a link domain: a text message must keep the sender's name readable. |
| `recipient_email_invalid` | 400 | invalid_request | recipient.email is not a valid e-mail address. |
| `recipient_missing_contact` | 400 | invalid_request | recipient needs at least one contact channel: email or phone. |
| `recipient_phone_invalid` | 400 | invalid_request | recipient.phone must be in E.164 format (e.g. +3546661234). |
| `recovery_link_invalid` | 400 | invalid_request | This sign-in link is not valid. Ask for a new one. |
| `recovery_session_restricted` | 403 | permission_error | Add a passkey first: until then this session can only add one and remove old ones. |
| `registration_closed` | 403 | permission_error | Sign-up is not open. |
| `registration_code_invalid` | 400 | invalid_request | This link is not valid. Use the code in the e-mail. |
| `registration_expired` | 409 | conflict | This sign-up has expired or was already completed. Start again. |
| `registration_not_confirmed` | 409 | conflict | Confirm the e-mail address first. |
| `registration_not_found` | 404 | not_found | No such sign-up. |
| `registration_required` | 409 | conflict | Finish registering first; then accept the invitation. |
| `registry_not_connected` | 500 | api_error | The National Registry is not connected yet; type the personal code instead. |
| `registry_query_invalid` | 400 | invalid_request | Search by a full 10-digit personal code, or by a full name (first name and surname). |
| `registry_rate_limited` | 429 | rate_limited | Too many registry searches this hour. Type the personal code instead. |
| `registry_unavailable` | 500 | api_error | The National Registry is not answering right now; type the personal code instead. |
| `remind_rate_limited` | 429 | rate_limited | Manual reminders to this recipient have reached their daily cap. Try again tomorrow. |
| `remind_state_invalid` | 409 | conflict | The first notification has not been sent yet. |
| `remind_too_soon` | 409 | conflict | A reminder can be sent a day after the request. |
| `request_too_large` | 413 | payload_too_large | The request body is too large. |
| `resource_missing` | 404 | invalid_request | No such object, or none that this key can see. `param` names the ID when there is one. |
| `route_not_found` | 404 | not_found | No endpoint matches this method and path. Check the address against the API reference. |
| `scim_not_in_plan` | 403 | permission_error | Provisioning (SCIM) comes with Plan 1–3 and Enterprise. |
| `scim_token_limit_reached` | 409 | conflict | Two tokens are live already. Revoke one first (two let you rotate without a gap). |
| `scim_token_not_found` | 404 | not_found | No such live SCIM token. |
| `secret_and_files_mutually_exclusive` | 400 | invalid_request | files and secret are mutually exclusive; secrets are their own delivery kind (POST /v1/secrets). |
| `send_confirmation_invalid` | 400 | invalid_request | This confirmation cannot be used: it was used already, it has expired (30 minutes), or it belongs to another sign-in. Confirm the send again. |
| `send_confirmation_mismatch` | 400 | invalid_request | The files, recipient or message differ from what was confirmed with the passkey. Confirm the send again. |
| `sender_authentication_insufficient` | 403 | permission_error | The person behind this session or key has not been identified strongly enough for this action. Sign in with your electronic ID. |
| `sender_representation_lapsed` | 403 | permission_error | The company registry no longer confirms that the person behind this key represents the company. Renew the confirmation in the portal. |
| `sender_representation_unverifiable` | 503 | api_error | The Company Registry could not be reached to confirm representation; try again later. |
| `service_unavailable` | 503 | api_error | The service is briefly unavailable. Try again in a moment. |
| `session_absolute_timeout` | 401 | authentication_error | The recipient's session has reached its longest allowed time. Open the delivery link again. |
| `session_expired` | 401 | authentication_error | The recipient's session has ended. Open the delivery link again. |
| `session_host_mismatch` | 401 | authentication_error | A recipient session was used on another address than the one it started on. Open the link again. |
| `session_state_invalid` | 409 | conflict | This delivery could not be completed at the level it requires. |
| `short_code_unavailable` | 500 | api_error | Could not allocate a short link for this delivery. |
| `sign_in_policy_self_lockout` | 409 | conflict | Sign in with an electronic ID first: requiring it would end your own access. |
| `sign_in_policy_unmet` | 403 | permission_error | This organisation requires sign-in with an electronic ID. Sign in again with eID or a passkey set up after an eID sign-in. |
| `sign_in_required` | 403 | permission_error | You signed in with your company's single sign-on, which opens only that account. Sign in with eID or a passkey to open another. |
| `sms_destination_not_available` | 400 | invalid_request | Parasend does not send SMS to this country yet. Notify by e-mail instead; see parasend.com/pricing/sms. |
| `sms_sender_name_decided` | 409 | conflict | Parasend has already answered this sender name request. |
| `sms_sender_name_invalid` | 400 | invalid_request | sms_sender_name must be 3–11 letters (a–z, A–Z) or digits with at least one letter: no spaces, hyphens or Icelandic letters. |
| `sms_sender_name_not_found` | 404 | not_found | No SMS sender name with that ID. |
| `sms_sender_name_reserved` | 400 | invalid_request | An SMS sender name cannot name Parasend. |
| `sms_sender_name_taken` | 409 | conflict | Another company has this SMS sender name. One company per name. |
| `sms_sender_name_unverified_company` | 403 | permission_error | Only a verified company can send SMS under its own name. Verify the company under Company settings first. |
| `smtp_not_configured` | 409 | invalid_request | Save the mail server first. |
| `smtp_senders_off` | 409 | invalid_request | Sending through your own mail server is not switched on here yet. |
| `spending_cap_reached` | 429 | rate_limited | This delivery would take the month's estimate over your spending cap. Raise the cap in the portal, or wait for next month. |
| `sso_access_turned_off` | 403 | permission_error | Your organisation has turned off your access to Parasend. |
| `sso_address_in_use` | 409 | conflict | Another person in this organisation already has this address. If that is you, sign in with the electronic ID you use as that member, then try again. |
| `sso_assertion_invalid` | 401 | authentication_error | Single sign-on did not succeed. |
| `sso_certificate_expired` | 409 | conflict | The identity provider's certificate has expired. Ask your administrator to update the connection. |
| `sso_company_only` | 403 | permission_error | Provisioning is for company accounts. |
| `sso_connection_disabled` | 409 | conflict | Turn the connection on again before testing it. |
| `sso_connection_exists` | 409 | conflict | This organisation already has an SSO connection. |
| `sso_connection_not_enabled` | 409 | conflict | Turn single sign-on on first; then it can be required. |
| `sso_connection_not_tested` | 409 | conflict | Test the connection first: sign in once through it with Test. |
| `sso_domain_not_verified` | 409 | conflict | Verify your organisation's e-mail domain first (Team → Domains). |
| `sso_enrolment_needs_proof` | 403 | permission_error | Sign in with your electronic ID, or verify your passport, to confirm who you are. |
| `sso_enrolment_required` | 409 | conflict | Confirm who you are with your electronic ID before your first sign-in with single sign-on. |
| `sso_identity_linked_elsewhere` | 409 | conflict | This identity is already linked to another person. |
| `sso_join_request_needs_email` | 409 | conflict | Your identity provider sent no e-mail address. Ask your administrator to invite you. |
| `sso_link_needs_eid` | 403 | permission_error | Sign in with your electronic ID first: the link is confirmed by it. |
| `sso_membership_suspended` | 403 | permission_error | Your access to this organisation is suspended. Ask your administrator. |
| `sso_metadata_pasted` | 409 | conflict | This connection's metadata was pasted; paste the new metadata instead. |
| `sso_not_available` | 503 | api_error | Provisioning is not set up in this environment yet. |
| `sso_not_configured` | 404 | not_found | This organisation has no SSO connection. |
| `sso_not_in_plan` | 403 | permission_error | Single sign-on comes with Plan 1–3 and Enterprise. |
| `sso_required` | 403 | permission_error | This organisation requires sign-in with its single sign-on. |
| `sso_self_lockout` | 409 | conflict | Sign in through your single sign-on first (or be the owner or a named admin signed in with eID), so you are not locked out. |
| `sso_sign_in_expired` | 410 | conflict | This sign-in has expired or was already used. Start again. |
| `sso_test_expired` | 409 | conflict | Run the test again: a test can be linked only in the session that ran it, within ten minutes. |
| `staff_admin_only` | 403 | permission_error | Only an admin on the staff list changes plans. |
| `staff_eid_required` | 403 | permission_error | Sign in with your electronic ID, or a passkey made with it, to use the staff admin. |
| `staff_member_unknown` | 400 | invalid_request | Pick someone on the staff list. |
| `staff_only` | 403 | permission_error | This sign-in is not on Parasend's staff list. |
| `system_policy_immutable` | 403 | permission_error | Parasend's own policies cannot be renamed or deleted, and `rpol_none` takes no steps. |
| `test_email_address_not_confirmed` | 400 | invalid_request | to must be one of your own confirmed e-mail addresses. |
| `test_email_limit_reached` | 429 | rate_limited | At most 5 test e-mails an hour. Try again later. |
| `theme_knob_plan_gated` | 403 | permission_error | This part of a brand profile comes with Plan 1 and up. |
| `too_many_approval_requests` | 409 | conflict | Too many requests are waiting. Cancel one first. |
| `too_many_checks` | 429 | rate_limited | Too many checks this hour. Senders are checked every 15 minutes anyway. |
| `too_many_company_applications` | 409 | conflict | Too many company applications are waiting. Cancel one first. |
| `too_many_identity_proofings` | 429 | rate_limited | Too many identity checks today. Try again tomorrow. |
| `too_many_join_requests` | 409 | conflict | Three requests to join by company code are already waiting for an answer. |
| `too_many_lookups` | 429 | rate_limited | Too many company lookups. Try again in an hour. |
| `too_many_signups` | 429 | rate_limited | Too many sign-ups from here, or for this address. Try again in an hour. |
| `too_many_tests` | 429 | rate_limited | Too many test e-mails for this sender this hour. Try again later. |
| `unknown_parameter` | 400 | invalid_request | The request has a parameter the endpoint does not know, often a typo. `param` names it. |
| `unsupported_media_type` | 415 | invalid_request | The request body's Content-Type is not accepted here. Send JSON (application/json) unless the endpoint says otherwise. |
| `upload_incomplete` | 400 | invalid_request | The upload is not complete. |
| `upload_link_invalid` | 401 | authentication_error | This upload link is not valid or has expired. |
| `upload_session_invalid` | 409 | conflict | This upload was cancelled or has expired; start it again. |
| `upload_session_not_found` | 404 | not_found | No such part of an open upload. |
| `view_link_invalid` | 401 | authentication_error | This preview link has expired; open it again from the delivery page. |
| `webhook_auth_config_invalid` | 400 | invalid_request | The endpoint's `auth` settings are missing or malformed for its mode, for example OAuth 2.0 without a `token_url`. |
| `webhook_delivery_sources_invalid` | 400 | invalid_request | `delivery_sources` is not valid: it names no key and not the portal, too many keys, or a key that is not your organisation's, not in the endpoint's mode, or revoked. |
| `webhook_endpoint_limit_reached` | 400 | invalid_request | You have as many webhook endpoints as one mode may have. Delete one first. |
| `webhook_endpoint_not_found` | 404 | not_found | No webhook endpoint with that ID, in the mode of your key. |
| `webhook_event_type_unknown` | 400 | invalid_request | An event type the endpoint should receive is not one Parasend sends. |
| `webhook_signature_invalid` | 401 | authentication_error | The webhook signature does not match. |
| `webhook_url_invalid` | 400 | invalid_request | url must be an https URL. |
| `webhook_url_not_public` | 400 | invalid_request | The host is an IP address or a reserved name, or resolves to a private, loopback or other non-public address. |
| `webhook_url_port_not_allowed` | 400 | invalid_request | The URL uses another port than 443. `param` names the URL. |
| `webhook_url_unresolvable` | 400 | invalid_request | The host has no A or AAAA record. Check the name for a typo. |
| `wording_archived` | 409 | conflict | This saved wording is archived; save a new one instead. |
| `wording_not_found` | 404 | not_found | No saved wording with that ID. |
| `wording_version_not_found` | 404 | not_found | The saved wording has no version with that number. |
| `zip_too_large` | 400 | invalid_request | Download the files one at a time. |
