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
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.jsonCall 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/companyUse 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 --jsoninnopalm 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/v1GET /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/healthCompany
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/companyServices
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/servicesGET /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-developmentIndustries
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/industriesGET /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-fintechCase 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-studiesGET /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-agentGuides
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/guidesGET /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-guideEnquiries
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"
}'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.
| Code | HTTP | Meaning | What to do |
|---|---|---|---|
| invalid_request | 400 | The body was not valid JSON, or a query parameter was malformed. | Fix the request shape. The hint names the parameter at fault. |
| validation_failed | 422 | The request parsed but a field was missing or unusable. | Read error.fields, correct each entry, and retry. |
| not_found | 404 | No resource exists at that slug. | List the collection first; the hint names the valid slugs. |
| method_not_allowed | 405 | The endpoint does not implement that verb. | Retry with a verb from the Allow header. |
| not_acceptable | 406 | The Accept header rules out every representation available. | Accept application/json for the API, or text/markdown or text/html for pages. |
| rate_limited | 429 | Too many enquiries from this client. | Wait for the interval in Retry-After, then retry once. |
| internal_error | 500 | innopalm failed to deliver the enquiry. It was not recorded. | Retry once, then fall back to emailing hello@innopalm.com. |
| gone | 410 | The resource was retired on purpose and will not return. | Stop requesting it; list the collections at /api/v1. |
| unavailable | 503 | The guides datastore is temporarily unreachable. The request itself was fine. | Retry in a few minutes; the rest of the API is unaffected. |