# Haavisa API > Visa requirements and application processing for Ethiopia, Somalia, Djibouti and Kenya. > Every eligibility verdict cites the statutory instrument behind it. Where no verified > rule exists, the API returns "unknown" rather than guessing. ## Core facts - Base URL: https://api.haavisa.com - OpenAPI 3.1 document: https://docs.haavisa.com/openapi.yaml - Authentication: API key as Authorization: Bearer or x-api-key: . Never a query parameter - those leak into access logs and Referer headers. - Error envelope: every failure, including 500s, returns { "error": { "code", "message", "request_id" } }. Branch on code. - Rate limits are per tenant, not per IP. ## The one thing to understand The request body is a person AND a journey, not a passport. POST /v1/check takes transit_airside, residence_permit_iso3 and passport_type because the exemptions that matter most depend on what the traveller is doing, not only on where they are from. Omitting those fields means those exemptions are not applied. verdict: "unknown" is a real answer meaning "we hold no verified rule", and visa_required is null - never false. Treating it as "no visa needed" is the one integration mistake that strands people at boarding gates. ## Docs - https://docs.haavisa.com/guides/quickstart - https://docs.haavisa.com/guides/authentication - https://docs.haavisa.com/guides/eligibility - https://docs.haavisa.com/guides/widget - https://docs.haavisa.com/guides/sdk - https://docs.haavisa.com/guides/webhooks - https://docs.haavisa.com/guides/errors ## Operations - POST /v1/check - Does this traveller need a visa for this destination? https://docs.haavisa.com/reference/checkRequirement - POST /v1/check/batch - A manifest: many travellers in one request https://docs.haavisa.com/reference/checkRequirementsBatch - GET /v1/checks/{requestId} - What we answered, and the statute behind it https://docs.haavisa.com/reference/getCheckAnswer - GET /v1/products - List visa products https://docs.haavisa.com/reference/listProducts - GET /v1/products/{code} - Fetch one product by code https://docs.haavisa.com/reference/getProduct - GET /v1/purposes - The reasons for travel a destination’s form offers https://docs.haavisa.com/reference/listDestinationPurposes - GET /v1/service-tiers - List service tiers https://docs.haavisa.com/reference/listServiceTiers - GET /v1/applications - List applications https://docs.haavisa.com/reference/listApplications - POST /v1/applications - Create an application on behalf of a traveller https://docs.haavisa.com/reference/createApplication - DELETE /v1/applications/{id} - Delete a draft https://docs.haavisa.com/reference/deleteApplication - GET /v1/applications/{id} - Fetch one application https://docs.haavisa.com/reference/getApplication - PATCH /v1/applications/{id} - Autosave a draft https://docs.haavisa.com/reference/updateApplication - GET /v1/applications/{id}/requirements - Read non-file requirement records https://docs.haavisa.com/reference/getApplicationRequirements - PUT /v1/applications/{id}/requirements - Provide a host code or insurance reference https://docs.haavisa.com/reference/putApplicationRequirements - POST /v1/applications/{id}/submit - Submit to the destination authority https://docs.haavisa.com/reference/submitApplication - GET /v1/applications/{id}/timeline - What has happened to this application https://docs.haavisa.com/reference/getApplicationTimeline - POST /v1/applications/lookup - Look up an application by reference and email https://docs.haavisa.com/reference/lookupApplication - GET /health - Liveness https://docs.haavisa.com/reference/health - GET /metrics - Queue depths, for a scraper https://docs.haavisa.com/reference/getMetrics - GET /ready - Readiness https://docs.haavisa.com/reference/ready - GET /v3/countries - Countries, in JSON:API https://docs.haavisa.com/reference/v3ListCountries - GET /v3/countries/{iso3} - One country, in JSON:API https://docs.haavisa.com/reference/v3GetCountry - GET /v3/procedures - What a traveller must do to enter a destination https://docs.haavisa.com/reference/v3ListProcedures - GET /v3/procedures/{id} - One procedure, by destination-nationality https://docs.haavisa.com/reference/v3GetProcedure - POST /v3/trips - An itinerary, answered leg by leg https://docs.haavisa.com/reference/v3CreateTrip - POST /v3/trips/llm - The same trip, with a quotable answer per leg https://docs.haavisa.com/reference/v3CreateTripLlm - GET /v3/webhooks - Webhook subscriptions https://docs.haavisa.com/reference/v3ListWebhooks - POST /v3/webhooks - Subscribe a URL https://docs.haavisa.com/reference/v3CreateWebhook - DELETE /v3/webhooks/{id} - Unsubscribe https://docs.haavisa.com/reference/v3DeleteWebhook - GET /v3/webhooks/{id} - One webhook https://docs.haavisa.com/reference/v3GetWebhook - PATCH /v3/webhooks/{id} - Update a webhook https://docs.haavisa.com/reference/v3UpdateWebhook - GET /v1/airlines - Airline roster for a destination https://docs.haavisa.com/reference/listAirlines - GET /v1/airports - Search airports https://docs.haavisa.com/reference/listAirports - GET /v1/airports/{iata} - Fetch one airport by IATA code https://docs.haavisa.com/reference/getAirport - GET /v1/cities - Search cities, one entry per place https://docs.haavisa.com/reference/listCities - GET /v1/countries - Countries, with the adjective for each nationality https://docs.haavisa.com/reference/listCountries - GET /v1/documents - Supporting documents an application will ask for https://docs.haavisa.com/reference/listDocumentRequirements - GET /v1/entry-points - Ports of entry, joined to the airports behind them https://docs.haavisa.com/reference/listEntryPoints - GET /v1/form-fields - The questions a destination’s application form asks https://docs.haavisa.com/reference/listFormFields - GET /v1/geo/location - Coarse location from the request https://docs.haavisa.com/reference/getGeoLocation - GET /v1/ports - Points of entry for a destination https://docs.haavisa.com/reference/listPorts - GET /v2/keys - List this tenant’s API keys https://docs.haavisa.com/reference/listKeys - POST /v2/keys - Issue an API key https://docs.haavisa.com/reference/issueKey - DELETE /v2/keys/{prefix} - Revoke an API key https://docs.haavisa.com/reference/revokeKey - GET /v2/me - Identify the calling tenant and key https://docs.haavisa.com/reference/getMe - GET /v2/reports/applications - Application volumes for a month https://docs.haavisa.com/reference/getApplicationReport - GET /v2/reports/usage - Metered usage for a month https://docs.haavisa.com/reference/getUsageReport - GET /v2/team - List this tenant’s portal users https://docs.haavisa.com/reference/listTeam - POST /v2/team - Invite a colleague https://docs.haavisa.com/reference/inviteTeamMember - GET /v2/invoices - Recent statements https://docs.haavisa.com/reference/listStatements - GET /v2/invoices/{period} - One month’s statement https://docs.haavisa.com/reference/getStatement - POST /v2/auth/logout - Sign out https://docs.haavisa.com/reference/logout - POST /v2/auth/magic-link - Email a sign-in link https://docs.haavisa.com/reference/requestMagicLink - GET /v2/auth/session - Who the session cookie belongs to https://docs.haavisa.com/reference/getSession - POST /v2/auth/verify - Exchange a sign-in token for a session https://docs.haavisa.com/reference/verifyMagicLink - GET /v2/webhook-endpoints - List this tenant’s webhook endpoints https://docs.haavisa.com/reference/listWebhookEndpoints - POST /v2/webhook-endpoints - Register a webhook endpoint https://docs.haavisa.com/reference/createWebhookEndpoint - DELETE /v2/webhook-endpoints/{id} - Delete an endpoint https://docs.haavisa.com/reference/deleteWebhookEndpoint - GET /v2/webhook-endpoints/{id} - Fetch one endpoint https://docs.haavisa.com/reference/getWebhookEndpoint - PATCH /v2/webhook-endpoints/{id} - Update an endpoint https://docs.haavisa.com/reference/updateWebhookEndpoint - GET /v2/webhook-endpoints/{id}/deliveries - Delivery log https://docs.haavisa.com/reference/listWebhookDeliveries - POST /v2/webhook-endpoints/{id}/rotate-secret - Rotate the signing secret https://docs.haavisa.com/reference/rotateWebhookSecret - GET /v2/webhook-events - The event vocabulary https://docs.haavisa.com/reference/listWebhookEvents - GET /v1/applications/{id}/documents - List an application’s documents https://docs.haavisa.com/reference/listDocuments - POST /v1/applications/{id}/documents - Ask for somewhere to put a file https://docs.haavisa.com/reference/requestDocumentUpload - DELETE /v1/documents/{id} - Remove a document before submission https://docs.haavisa.com/reference/deleteDocument - POST /v1/documents/{id}/complete - Report that an upload finished, and get the verdict https://docs.haavisa.com/reference/completeDocumentUpload - GET /v1/documents/{id}/url - A short-lived link to a stored document https://docs.haavisa.com/reference/getDocumentUrl - POST /v1/documents/mrz - Read a passport page's machine-readable zone https://docs.haavisa.com/reference/readPassportMrz - POST /v1/documents/photo - Render a correctly sized passport photograph https://docs.haavisa.com/reference/renderPassportPhoto - GET /v1/storage/local - Read one object (local storage driver) https://docs.haavisa.com/reference/localStorageDownload - PUT /v1/storage/local - Upload one object (local storage driver) https://docs.haavisa.com/reference/localStorageUpload - POST /v1/capture - Authorise payment for an application https://docs.haavisa.com/reference/capturePayment - GET /v2/providers - Payment providers available for a corridor https://docs.haavisa.com/reference/listProviders - POST /v2/webhooks/{provider} - Payment provider callback https://docs.haavisa.com/reference/providerWebhook - POST /v2/consent - Record an answer to the storage-consent banner https://docs.haavisa.com/reference/recordConsent - GET /v1/admin/activity - Search the audit log https://docs.haavisa.com/reference/adminListActivity - GET /v1/admin/applicant-users - Search the applicant directory https://docs.haavisa.com/reference/adminListApplicantUsers - POST /v1/admin/applicants - Create an applicant account by hand https://docs.haavisa.com/reference/adminCreateApplicant - GET /v1/admin/applications - The operations queue https://docs.haavisa.com/reference/adminListApplications - GET /v1/admin/applications/{id} - One application in full https://docs.haavisa.com/reference/adminGetApplication - POST /v1/admin/applications/{id}/decision-document - Attach an authority decision PDF https://docs.haavisa.com/reference/adminAttachDecisionDocument - POST /v1/admin/applications/{id}/documents-request - Ask the applicant for more documents https://docs.haavisa.com/reference/adminRequestAdditionalDocuments - POST /v1/admin/applications/{id}/documents-request/{requestId}/review - Accept, reject or cancel a requested replacement https://docs.haavisa.com/reference/adminReviewRequestedDocument - GET /v1/admin/applications/{id}/documents/{documentId} - Fetch one uploaded application document https://docs.haavisa.com/reference/adminFetchApplicantDocument - POST /v1/admin/applications/{id}/email - Email the applicant about their application https://docs.haavisa.com/reference/adminSendCustomerEmail - GET /v1/admin/applications/{id}/evidence/{filename} - Fetch one submission evidence screenshot https://docs.haavisa.com/reference/adminApplicationEvidence - POST /v1/admin/applications/{id}/government-payment - Hand the government its fee https://docs.haavisa.com/reference/adminRequestGovernmentPayment - POST /v1/admin/applications/{id}/government-payment/record - Record a portal quote, uncertain payment, receipt or reconciliation https://docs.haavisa.com/reference/adminRecordGovernmentPayment - POST /v1/admin/applications/{id}/requirements/review - Verify a requirement or record an evidenced exemption https://docs.haavisa.com/reference/adminReviewRequirement - POST /v1/admin/applications/{id}/status-check - Ask the portal about this application now https://docs.haavisa.com/reference/adminBringStatusCheckForward - POST /v1/admin/applications/{id}/submission - Record a government submission https://docs.haavisa.com/reference/adminRecordSubmission - POST /v1/admin/applications/{id}/submission/enqueue - Queue a browser submission https://docs.haavisa.com/reference/adminEnqueueSubmission - GET /v1/admin/applications/{id}/timeline - Everything that happened to one application https://docs.haavisa.com/reference/adminApplicationTimeline - GET /v1/admin/automation - Read submission and status-check queues https://docs.haavisa.com/reference/adminGetAutomationQueues - GET /v1/admin/customers - Search applicant customers https://docs.haavisa.com/reference/adminListCustomers - GET /v1/admin/customers/{id} - One applicant account, with the applications it owns https://docs.haavisa.com/reference/adminGetCustomer - POST /v1/admin/customers/{id}/verification-email - Re-send the address-verification email https://docs.haavisa.com/reference/adminResendVerificationEmail - GET /v1/admin/documents - List applicant documents https://docs.haavisa.com/reference/adminListDocuments - GET /v1/admin/government-payments - List government fee handoffs https://docs.haavisa.com/reference/adminListGovernmentPayments - GET /v1/admin/mailbox - List messages from a Postern inbox https://docs.haavisa.com/reference/adminListMailboxMessages - GET /v1/admin/mailbox/{source}/{messageId} - Read a matched Postern message https://docs.haavisa.com/reference/adminGetMailboxMessage - GET /v1/admin/notifications - Messages that did not land https://docs.haavisa.com/reference/adminListNotifications - POST /v1/admin/notifications/{id}/requeue - Put one message back in the worker’s path https://docs.haavisa.com/reference/adminRequeueNotification - GET /v1/admin/operators - List operations team access https://docs.haavisa.com/reference/adminListOperators - POST /v1/admin/operators - Add an operations user https://docs.haavisa.com/reference/adminCreateOperator - PATCH /v1/admin/operators/{email} - Change an operations role or access state https://docs.haavisa.com/reference/adminUpdateOperator - POST /v1/admin/operators/{email}/invitation - Re-send an operator’s invitation https://docs.haavisa.com/reference/adminSendOperatorInvitation - GET /v1/admin/operators/authorization/{email} - Resolve an operations user https://docs.haavisa.com/reference/adminResolveOperator - GET /v1/admin/payment-recovery - List abandoned payment attempts https://docs.haavisa.com/reference/adminListPaymentRecovery - POST /v1/admin/payment-recovery/{id}/remind - Send a checkout reminder https://docs.haavisa.com/reference/adminRemindPaymentRecovery - GET /v1/admin/payments - Recent payments https://docs.haavisa.com/reference/adminListPayments - PATCH /v1/admin/products/{code}/availability - Show or hide one product https://docs.haavisa.com/reference/adminUpdateProductAvailability - PATCH /v1/admin/products/{code}/pricing - Update a product government fee https://docs.haavisa.com/reference/adminUpdateProductPricing - PATCH /v1/admin/service-tiers/{id}/pricing - Update a service tier fee https://docs.haavisa.com/reference/adminUpdateServiceTierPricing - GET /v1/admin/stats - Queue and revenue totals https://docs.haavisa.com/reference/adminStats - POST /v1/admin/stripe/catalog/sync - Push the catalogue and service tiers to Stripe https://docs.haavisa.com/reference/adminSyncStripeCatalog - GET /v1/admin/system/submission-worker - Read the submission worker control https://docs.haavisa.com/reference/adminGetSubmissionWorkerControl - PATCH /v1/admin/system/submission-worker - Enable or pause government submission processing https://docs.haavisa.com/reference/adminSetSubmissionWorkerEnabled - GET /v1/admin/visa-data - Read visa data and price catalogue https://docs.haavisa.com/reference/adminGetVisaData - PATCH /v1/admin/visa-data/{destination}/availability - Show or hide every product for one destination https://docs.haavisa.com/reference/adminUpdateDestinationAvailability - POST /v1/admin/visa-data/{destination}/requirements - Publish a new version of a destination’s document requirements https://docs.haavisa.com/reference/adminPublishVisaRequirements - POST /v1/admin/visa-data/{destination}/sources - Add a visa data source https://docs.haavisa.com/reference/adminCreateVisaDataSource - DELETE /v1/admin/visa-data/sources/{id} - Remove a visa data source https://docs.haavisa.com/reference/adminDeleteVisaDataSource - PATCH /v1/admin/visa-data/sources/{id} - Update a visa data source https://docs.haavisa.com/reference/adminUpdateVisaDataSource - GET /v1/checkout-return - Resolve a Stripe checkout return https://docs.haavisa.com/reference/resolveCheckoutReturn - GET /v1/rules/freshness - Which eligibility answers are past their re-verification cadence https://docs.haavisa.com/reference/getRuleFreshness - GET /v2/projects - List tenants https://docs.haavisa.com/reference/listProjects - POST /v2/projects - Create a tenant https://docs.haavisa.com/reference/createProject - GET /v2/projects/{id} - Fetch a tenant and its keys https://docs.haavisa.com/reference/getProject - PUT /v2/projects/{id} - Reconfigure a tenant https://docs.haavisa.com/reference/updateProject - DELETE /v2/projects/{id}/keys/{prefix} - Revoke any tenant’s key https://docs.haavisa.com/reference/adminRevokeKey - GET /v2/projects/{id}/users - List a tenant’s portal users https://docs.haavisa.com/reference/listPartnerUsers - POST /v2/projects/{id}/users - Invite a partner user https://docs.haavisa.com/reference/invitePartnerUser - GET /v1/admin/support/tickets - Manage support tickets https://docs.haavisa.com/reference/adminSupportgetList - GET /v1/admin/support/tickets/{id} - Manage support tickets https://docs.haavisa.com/reference/adminSupportgetid - PATCH /v1/admin/support/tickets/{id} - Manage support tickets https://docs.haavisa.com/reference/adminSupportpatchid - POST /v1/admin/support/tickets/{id}/messages - Manage support tickets https://docs.haavisa.com/reference/adminSupportpostidmessages - GET /v1/applications/mine - List the signed-in applicant’s own applications https://docs.haavisa.com/reference/listMyApplications - POST /v1/contact - Send a message from the contact form https://docs.haavisa.com/reference/sendContactMessage - GET /v1/rules/export - The whole rule set, for a partner to hold locally https://docs.haavisa.com/reference/exportRules - GET /v1/support/tickets - Read or write your own support tickets https://docs.haavisa.com/reference/applicantSupportgetList - POST /v1/support/tickets - Read or write your own support tickets https://docs.haavisa.com/reference/applicantSupportpostList - GET /v1/support/tickets/{id} - Read or write your own support tickets https://docs.haavisa.com/reference/applicantSupportgetid - POST /v1/support/tickets/{id}/messages - Read or write your own support tickets https://docs.haavisa.com/reference/applicantSupportpostidmessages - POST /v1/token - Issue or refresh a session https://docs.haavisa.com/reference/issueToken - GET /v1/token/introspect - Check whether the caller holds a valid session https://docs.haavisa.com/reference/introspectToken - POST /v1/token/mfa - Complete the second factor https://docs.haavisa.com/reference/completeMfa - POST /v1/token/revoke - Revoke a session https://docs.haavisa.com/reference/revokeToken - POST /v2/accounts - Register an applicant account https://docs.haavisa.com/reference/registerAccount - GET /v2/accounts/me - The signed-in applicant https://docs.haavisa.com/reference/getAccount - PATCH /v2/accounts/me - Update the signed-in applicant https://docs.haavisa.com/reference/updateAccount - GET /v2/accounts/me/messaging-consent - May we message this number? https://docs.haavisa.com/reference/getMessagingConsent - PUT /v2/accounts/me/messaging-consent - Record a messaging opt-in or opt-out https://docs.haavisa.com/reference/setMessagingConsent - POST /v2/accounts/mfa/activate - Confirm and enable two-factor authentication https://docs.haavisa.com/reference/activateMfa - POST /v2/accounts/mfa/disable - Disable two-factor authentication https://docs.haavisa.com/reference/disableMfa - POST /v2/accounts/mfa/enroll - Begin two-factor enrolment https://docs.haavisa.com/reference/enrollMfa - POST /v2/accounts/password-reset - Ask for a password-reset link https://docs.haavisa.com/reference/requestPasswordReset - POST /v2/accounts/password-reset/confirm - Set a password from a mailed link https://docs.haavisa.com/reference/confirmPasswordReset - POST /v2/accounts/sign-in - Sign in to the applicant wizard https://docs.haavisa.com/reference/signInAccount - POST /v2/accounts/sign-out - Sign out of the applicant wizard https://docs.haavisa.com/reference/signOutAccount - POST /v2/accounts/verify-email - Confirm an email address https://docs.haavisa.com/reference/verifyEmail - POST /v2/accounts/verify-email/resend - Send the confirmation link again https://docs.haavisa.com/reference/resendEmailVerification - POST /v2/messaging/{provider}/inbound - Inbound messaging callback (STOP / START) https://docs.haavisa.com/reference/messagingInboundWebhook - POST /v2/track - Ingest analytics events https://docs.haavisa.com/reference/trackEvents - POST /v2/webhooks/email - Email delivery callback (delivered / bounced / complained) https://docs.haavisa.com/reference/emailEventWebhook - GET /v2/webhooks/whatsapp - WhatsApp webhook verification handshake https://docs.haavisa.com/reference/verifyWhatsAppWebhook - POST /v2/webhooks/whatsapp - WhatsApp delivery receipts and inbound replies https://docs.haavisa.com/reference/whatsAppEventWebhook