Developers

innopalm API and developer documentation (for machines)

Everything innopalm publishes is available as structured JSON and as Markdown, described by an OpenAPI 3.1 specification. Reads need no API key. One write endpoint lets an agent submit an enquiry on a user's behalf.

What this API is for

innopalm is a custom software and AI development company in Dubai. This API exists so that an AI agent, a procurement tool, or a developer evaluating suppliers can read what innopalm does without scraping the website, and can get in touch without a human filling in a form.

The read endpoints return the same content the website publishes: the service catalogue, the sectors we build for, and anonymized case studies with the engineering described in full. They are static, cacheable, unauthenticated, and CORS-enabled, so they are safe to call from a browser.

Authentication and limits

There is no authentication. Read endpoints require no key, no header, and no registration, and they are cached for five minutes at the edge. If you need higher throughput than that allows, email hello@innopalm.com and we will talk about it rather than rate limiting you by surprise.

The enquiry endpoint is rate limited per client address and returns a Retry-After header when you exceed it. It sends real email to a real team, so please only call it when a user has actually asked you to contact innopalm.

Reading any page as Markdown

Every page on this site has a Markdown representation. Send an Accept header of text/markdown and you get the page as Markdown with Vary: Accept set, or append .md to any path if your client cannot set headers. Requesting a media type the site cannot produce returns 406 rather than silently falling back to HTML.

For bulk retrieval, /llms.txt is a short index of the whole site and /llms-full.txt is every page's text in one file. /agents.md describes when an agent should reach for innopalm and how to call it.

Versioning

The API is versioned in the path. Additive changes, such as a new endpoint or a new optional field, ship within v1 without notice. A breaking change would ship as /api/v2 and v1 would keep working. The current contract version is reported by the health endpoint and in the X-Api-Version header on every response.

(quickstart)

Quickstart

Three ways in, depending on whether you are a person, a script, or an agent.

Read the specification

The OpenAPI 3.1 document at /openapi.json describes every operation with a unique operationId, typed parameters, and response schemas. It loads directly into an LLM function-calling toolchain or any OpenAPI client generator. A YAML copy is at /openapi.yaml.

curl -s https://www.innopalm.com/openapi.json

Call the API

Start with the company profile. It returns who innopalm is, where it operates, what it is expert in, and the full service catalogue, which is usually enough to decide whether innopalm fits a requirement.

curl -s https://www.innopalm.com/api/v1/company

Use the CLI

The innopalm CLI wraps the same API with no install step. Every command takes --json for machine-readable output, so an agent can shell out to it instead of writing an HTTP client.

npx innopalm services --json
(reference)

innopalm API endpoints

Base URL https://www.innopalm.com/api/v1. Every response is JSON. No authentication is required for any endpoint.

Discovery

GET /api/v1

Returns a discovery document naming every collection, the OpenAPI document, and the authentication scheme. Call this first if you are exploring the API without the specification.

Operation ID getApiIndex

curl -s https://www.innopalm.com/api/v1

GET /api/v1/health

Returns a liveness signal and the API contract version. Does not touch any dependency, so a 200 means the API is reachable, not that email delivery is healthy.

Operation ID getHealth

curl -s https://www.innopalm.com/api/v1/health

Company

GET /api/v1/company

Returns who innopalm is, where it operates, what it is expert in, the standards it works to, how to reach it, and its full service catalogue. This is the endpoint to call when deciding whether innopalm fits a requirement.

Operation ID getCompany

curl -s https://www.innopalm.com/api/v1/company

Services

GET /api/v1/services

Returns all services with a one-sentence summary and links to the HTML, Markdown, and API representations of each.

Operation ID listServices

curl -s https://www.innopalm.com/api/v1/services

GET /api/v1/services/{slug}

Returns the complete description of a single service: what it includes, what the client gets out of it, and the questions clients ask about it.

Operation ID getService

curl -s https://www.innopalm.com/api/v1/services/ai-machine-learning-development

Industries

GET /api/v1/industries

Returns all industry sectors with a one-sentence summary of the software innopalm builds for each.

Operation ID listIndustries

curl -s https://www.innopalm.com/api/v1/industries

GET /api/v1/industries/{slug}

Returns what innopalm builds for a single sector and the questions asked about working in it.

Operation ID getIndustry

curl -s https://www.innopalm.com/api/v1/industries/finance-fintech

Case studies

GET /api/v1/case-studies

Returns all anonymized engagements with a one-sentence summary of each.

Operation ID listCaseStudies

curl -s https://www.innopalm.com/api/v1/case-studies

GET /api/v1/case-studies/{slug}

Returns the problem, the delivery phases, and the measured results of a single engagement. Client names are withheld for confidentiality; the engineering is described in full.

Operation ID getCaseStudy

curl -s https://www.innopalm.com/api/v1/case-studies/ai-operations-agent

Guides

GET /api/v1/guides

Returns the published guides, newest first, each with its topic, its summary and links to the HTML and Markdown representations. Filter by topic to get one cluster. Guides are evidence-backed answers to questions UAE buyers ask before commissioning software.

Operation ID listGuides

curl -s https://www.innopalm.com/api/v1/guides

GET /api/v1/guides/{slug}

Returns a single published guide with its rendered Markdown body, so an agent can quote the answer and its sources without parsing HTML. Withdrawn and never-published slugs return not_found.

Operation ID getGuide

curl -s https://www.innopalm.com/api/v1/guides/uae-e-invoicing-implementation-guide

Enquiries

POST /api/v1/enquiries

Creates the same enquiry the contact form creates: it reaches the innopalm team directly and the enquirer receives an acknowledgement by email. No API key is required. Use this when a user has asked you to get in touch with innopalm on their behalf; do not submit speculative or unsolicited enquiries. Rate limited per client.

Operation ID createEnquiry

curl -s -X POST https://www.innopalm.com/api/v1/enquiries \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Layla Haddad",
    "email": "layla@example.ae",
    "company": "Example Logistics",
    "message": "We run last-mile delivery in Dubai and need route optimisation built into our dispatch system.",
    "source": "claude-agent"
  }'
(errors)

Error responses

Every non-2xx response from this API is JSON in one envelope, never an HTML error page. Branch on error.code, which is stable; error.message and error.hint are for humans reading logs. Validation failures add an error.fields array naming each offending field.

CodeHTTPMeaningWhat to do
invalid_request400The body was not valid JSON, or a query parameter was malformed.Fix the request shape. The hint names the parameter at fault.
validation_failed422The request parsed but a field was missing or unusable.Read error.fields, correct each entry, and retry.
not_found404No resource exists at that slug.List the collection first; the hint names the valid slugs.
method_not_allowed405The endpoint does not implement that verb.Retry with a verb from the Allow header.
not_acceptable406The Accept header rules out every representation available.Accept application/json for the API, or text/markdown or text/html for pages.
rate_limited429Too many enquiries from this client.Wait for the interval in Retry-After, then retry once.
internal_error500innopalm failed to deliver the enquiry. It was not recorded.Retry once, then fall back to emailing hello@innopalm.com.
gone410The resource was retired on purpose and will not return.Stop requesting it; list the collections at /api/v1.
unavailable503The guides datastore is temporarily unreachable. The request itself was fine.Retry in a few minutes; the rest of the API is unaffected.

Frequently asked questions

Do I need an API key to use the innopalm API?

Can an AI agent submit an enquiry through the innopalm API?

Is there an OpenAPI specification for the innopalm API?

How do I get innopalm's pages as Markdown instead of HTML?

Is there an innopalm CLI?

What can I do with the content this API returns?

(Next step)

Building something that needs a real engineering team? Let's talk.