{"openapi":"3.1.0","info":{"title":"idataraya public API","version":"1.0.0","summary":"Read-only access to what idataraya builds, and endpoints for getting in touch.","description":"idataraya is a Malaysian software engineering company that designs, builds, deploys and operates enterprise systems: payments and acceptance, business systems, payroll and HR, data platforms, cloud infrastructure and applied AI.\n\nUse this API to answer questions about what idataraya does, which sectors it works in, what it has delivered for named clients, and what its engineers have published. Everything under /api/v1 is public, needs no key, and is served as static JSON from the edge.\n\nUse POST /api/contact to send an enquiry on a person's behalf, and POST /api/apply to submit a job application. Both deliver email and neither returns any stored record, so treat them as one-way.\n\nEvery page on the site is also available as markdown: request it with `Accept: text/markdown`, or append `.md` to the path.\n\nRate limits: responses carry RateLimit-Policy and RateLimit-Limit headers declaring an advisory ceiling of 60 requests per minute per client. Stay under it and you will never be throttled; a 429, should the edge ever return one, carries Retry-After. Details at https://idataraya.com/developers/#rate-limits.\n\nVersioning: the API is versioned in the URL path (/api/v1). Changes within v1 are additive only. A breaking change ships as /api/v2 alongside v1, and a version being retired announces it with Deprecation and Sunset headers on every response for at least six months before removal. Policy at https://idataraya.com/developers/#versioning.","contact":{"name":"idataraya enquiries","email":"info@idataraya.com","url":"https://idataraya.com/contact/"},"termsOfService":"https://idataraya.com/terms/","license":{"name":"Content is published for reading and citation, not redistribution.","url":"https://idataraya.com/terms/"}},"servers":[{"url":"https://idataraya.com","description":"Production"}],"externalDocs":{"description":"Developer and agent documentation","url":"https://idataraya.com/developers/"},"tags":[{"name":"discovery","description":"Finding the rest of the API."},{"name":"company","description":"Facts about idataraya itself."},{"name":"capabilities","description":"What idataraya engineers and operates."},{"name":"industries","description":"The sectors idataraya works in."},{"name":"client-impact","description":"Named client engagements."},{"name":"insights","description":"Published field notes."},{"name":"contact","description":"Getting in touch. The only operations that write."}],"paths":{"/api/v1/index.json":{"get":{"operationId":"get_api_index","summary":"List every endpoint in this API","description":"Start here. Returns the API's own description and the absolute URL of every other endpoint, so no URL has to be guessed. Call this first when you have only the domain.","tags":["discovery"],"responses":{"200":{"description":"The discovery document.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/ApiIndex"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/organization.json":{"get":{"operationId":"get_organization","summary":"Get the company profile","description":"Returns idataraya's legal name, description, contact addresses, phone number and location. Use this to answer who idataraya is, where it is based, or how to contact it, rather than reading the marketing pages.","tags":["company"],"responses":{"200":{"description":"The company profile.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Organization"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/capabilities.json":{"get":{"operationId":"list_capabilities","summary":"List what idataraya can build and operate","description":"Returns every capability with a one-line summary and the URL of its full record. Use this to answer whether idataraya does a particular kind of work before fetching any detail.","tags":["capabilities"],"responses":{"200":{"description":"Every published capability.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/CapabilityList"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/capabilities/{slug}.json":{"get":{"operationId":"get_capability","summary":"Get one capability in full","description":"Returns the services offered under a capability, how the work is approached, and outcome figures from real engagements. Call list_capabilities first if you do not already have the slug.","tags":["capabilities"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Capability identifier, as returned by list_capabilities.","schema":{"type":"string","description":"Capability identifier, as returned by list_capabilities.","enum":["artificial-intelligence","business-resilience","business-systems","cloud-and-infrastructure","data-and-analytics","digital-and-technology","mobile-applications","operations","payment-hardware","payments-and-acceptance","payroll-and-hr","risk-management-and-compliance","security"]}}],"responses":{"200":{"description":"The capability record.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/SectionDetail"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/industries.json":{"get":{"operationId":"list_industries","summary":"List the sectors idataraya works in","description":"Returns every sector with a one-line summary and the URL of its full record. Use this to answer whether idataraya has experience in a given sector.","tags":["industries"],"responses":{"200":{"description":"Every published sector.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/IndustryList"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/industries/{slug}.json":{"get":{"operationId":"get_industry","summary":"Get one sector in full","description":"Returns what idataraya builds for a sector, how it approaches the work, the products involved, and outcome figures. Call list_industries first if you do not already have the slug.","tags":["industries"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Sector identifier, as returned by list_industries.","schema":{"type":"string","description":"Sector identifier, as returned by list_industries.","enum":["commercial-property","education","financial-institutions","health-care","property-developers","public-sector","retail","strata-management","transportation-logistics","travel-tourism"]}}],"responses":{"200":{"description":"The sector record.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/SectionDetail"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/client-impact.json":{"get":{"operationId":"list_client_impact","summary":"List named client engagements","description":"Returns every engagement idataraya publishes by name, with its headline figure. Use this for evidence of delivered work; every entry names a real client who agreed to be named.","tags":["client-impact"],"responses":{"200":{"description":"Every published engagement.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/ClientImpactList"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/client-impact/{slug}.json":{"get":{"operationId":"get_client_impact","summary":"Get one client engagement in full","description":"Returns the problem, what was built, what it connects to, and the measured outcomes for a named engagement. Call list_client_impact first if you do not already have the slug.","tags":["client-impact"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Engagement identifier, as returned by list_client_impact.","schema":{"type":"string","description":"Engagement identifier, as returned by list_client_impact.","enum":["mypride"]}}],"responses":{"200":{"description":"The engagement record.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/ClientImpactDetail"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/insights.json":{"get":{"operationId":"list_insights","summary":"List published field notes","description":"Returns every published field note with its headline, standfirst, authors and date, but not its body. Use this to find a piece on a subject before fetching the full text.","tags":["insights"],"responses":{"200":{"description":"Every published field note.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/InsightList"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/insights/{slug}.json":{"get":{"operationId":"get_insight","summary":"Get the full text of one field note","description":"Returns an article's takeaways, body paragraphs and pull quote as structured JSON. Prefer this over scraping the HTML page. Call list_insights first if you do not already have the slug.","tags":["insights"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Article identifier, as returned by list_insights.","schema":{"type":"string","description":"Article identifier, as returned by list_insights.","enum":["account-recovery-soft-way-in","arrears-need-a-trail","audit-evidence","automating-the-wrong-step","billing-starts-in-the-lease","building-outlives-its-systems","cash-on-delivery-control","checkable-answers","claims-follow-up","controls-that-need-discipline","degrading-well","duplicate-student-records","front-desk-integration-layer","inheriting-a-system","integration-is-the-building","one-catalogue","online-store-oversell","outlets-one-balance-sheet","parallel-running-is-the-test","payroll-errors-are-entered","progressive-billing-certification","provisioning-a-terminal-fleet","rare-releases-are-large","seasonal-hiring-software","semester-close","settlement-files","signal-at-the-door","soundbox-trust-upgrade","tendering-for-maintenance","test-on-real-phones","the-asasii-suite","the-engagement-model","third-year-cloud-bill","timeout-unknown-outcome","two-people-two-numbers","untested-restore","vacant-possession-data","what-breaks-in-bank-integrations","where-reporting-breaks","whose-records-managing-agent","workarounds-are-requirements"]}}],"responses":{"200":{"description":"The article, including its body.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/InsightDetail"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/contact":{"post":{"operationId":"send_enquiry","summary":"Send an enquiry to idataraya","description":"Delivers an enquiry by email to the idataraya team. Use this only with a real person's own details and their intent: it reaches people, it cannot be recalled, and there is no way to read the message back afterwards. Nothing is stored and no record is returned. Expect a reply by email within one working day.","tags":["contact"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/EnquiryRequest"}}}},"responses":{"200":{"description":"The enquiry was accepted for delivery.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Accepted"}}}},"400":{"description":"The body was missing a required field or malformed.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"500":{"description":"Mail delivery is not configured on the server.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"502":{"description":"The mail service could not be reached or rejected the message.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}},"/api/apply":{"post":{"operationId":"submit_application","summary":"Submit a job application","description":"Delivers a job application, optionally with a CV attached, by email to the idataraya careers team. Same caution as send_enquiry: it reaches people and cannot be recalled, so use it only with a real applicant's own details and consent. Open roles are listed at https://careers.idataraya.com.","tags":["contact"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/ApplicationRequest"}}}},"responses":{"200":{"description":"The application was accepted for delivery.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Accepted"}}}},"400":{"description":"The body was missing a required field or malformed.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not allowed on this path.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"500":{"description":"Mail delivery is not configured on the server.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}},"502":{"description":"The mail service could not be reached or rejected the message.","content":{"application/json":{"schema":{"type":"object","$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"ApiIndex":{"type":"object","description":"Discovery document for this API.","properties":{"name":{"type":"string","description":"Human name for the API."},"description":{"type":"string","description":"What the API covers and what it costs to use."},"version":{"type":"string","description":"Semantic version of the wire format."},"self":{"type":"string","description":"This endpoint's own URL."},"documentation_url":{"type":"string","description":"Human-readable documentation."},"openapi_url":{"type":"string","description":"This OpenAPI document."},"llms_txt_url":{"type":"string","description":"The site's llms.txt."},"terms_url":{"type":"string","description":"Terms covering use of this API."},"endpoints":{"type":"array","description":"Every endpoint in this API version.","items":{"type":"object","description":"One endpoint in this API.","properties":{"name":{"type":"string","description":"Short identifier."},"description":{"type":"string","description":"What the endpoint returns."},"url":{"type":"string","description":"Absolute URL."}},"required":["name","description","url"],"additionalProperties":false}}},"required":["name","description","version","self","documentation_url","openapi_url","llms_txt_url","terms_url","endpoints"],"additionalProperties":false},"Organization":{"type":"object","description":"The company: what it does, how to reach it, and where it is.","properties":{"self":{"type":"string","description":"This endpoint's own URL."},"name":{"type":"string","description":"Trading name."},"legal_name":{"type":"string","description":"Registered legal name."},"description":{"type":"string","description":"One-paragraph description of what the company does."},"url":{"type":"string","description":"Company home page."},"logo_url":{"type":"string","description":"Canonical logo asset."},"same_as":{"type":"array","description":"Profiles the company controls elsewhere.","items":{"type":"string","description":"Profile URL."}},"contact":{"type":"object","description":"How to reach the company.","properties":{"email":{"type":"string","description":"The address for every enquiry, new client or existing."},"telephone":{"type":"string","description":"Main line in E.164 format."},"contact_form_url":{"type":"string","description":"The contact page a person should use."},"contact_api_url":{"type":"string","description":"The endpoint an agent should POST an enquiry to."}},"required":["email","telephone","contact_form_url","contact_api_url"],"additionalProperties":false},"address":{"type":"object","description":"Registered location, at the level it is published.","properties":{"street_address":{"type":["string","null"],"description":"Street line, or null when not published."},"locality":{"type":"string","description":"City or town."},"region":{"type":["string","null"],"description":"State or region, or null when not published."},"postal_code":{"type":["string","null"],"description":"Postal code, or null when not published."},"country":{"type":"string","description":"ISO 3166-1 alpha-2 country code."}},"required":["street_address","locality","region","postal_code","country"],"additionalProperties":false},"area_served":{"type":"array","description":"Countries the company operates in.","items":{"type":"string","description":"ISO 3166-1 alpha-2 country code."}},"languages":{"type":"array","description":"Languages the company works in.","items":{"type":"string","description":"ISO 639-1 language code."}}},"required":["self","name","legal_name","description","url","logo_url","same_as","contact","address","area_served","languages"],"additionalProperties":false},"SectionSummary":{"type":"object","description":"A capability or industry as it appears in a list response.","properties":{"slug":{"type":"string","description":"URL-safe identifier, unique within the collection."},"title":{"type":"string","description":"Display name."},"summary":{"type":"string","description":"One-sentence description. Empty when only the placeholder page is published."},"html_url":{"type":"string","description":"The human-readable page for this entry."},"api_url":{"type":"string","description":"The full record for this entry."},"detailed":{"type":"boolean","description":"False when the entry is listed in navigation but its page content is not written yet, in which case the prose fields are empty strings."}},"required":["slug","title","summary","html_url","api_url","detailed"],"additionalProperties":false},"SectionDetail":{"type":"object","description":"A capability or industry with the full contents of its page.","properties":{"slug":{"type":"string","description":"URL-safe identifier, unique within the collection."},"title":{"type":"string","description":"Display name."},"summary":{"type":"string","description":"One-sentence description. Empty when only the placeholder page is published."},"html_url":{"type":"string","description":"The human-readable page for this entry."},"api_url":{"type":"string","description":"The full record for this entry."},"detailed":{"type":"boolean","description":"False when the entry is listed in navigation but its page content is not written yet, in which case the prose fields are empty strings."},"eyebrow":{"type":"string","description":"Section label shown above the page title."},"intro":{"type":"string","description":"Opening line of the page."},"lead":{"type":"string","description":"Supporting paragraph under the opening line."},"services":{"type":"array","description":"The individual services offered under this capability or to this sector.","items":{"type":"object","description":"One thing idataraya does under this heading.","properties":{"title":{"type":"string","description":"Service name."},"description":{"type":"string","description":"What the service covers."}},"required":["title","description"],"additionalProperties":false}},"how_we_help":{"type":"array","description":"Longer answers to how the work is approached.","items":{"type":"object","description":"A titled block of prose.","properties":{"title":{"type":"string","description":"Heading for the block."},"body":{"type":"string","description":"The block's text, plain prose with no markup."}},"required":["title","body"],"additionalProperties":false}},"impact":{"type":"array","description":"Outcome figures from real engagements.","items":{"type":"object","description":"A published outcome figure.","properties":{"value":{"type":"string","description":"The figure as published."},"caption":{"type":"string","description":"What the figure refers to."},"summary":{"type":"string","description":"The engagement or context behind the figure."}},"required":["value","caption","summary"],"additionalProperties":false}},"products":{"type":"array","description":"Named products relevant to this entry. Empty for capability entries, which describe work rather than software.","items":{"type":"object","description":"A named product the engagement or page involves.","properties":{"name":{"type":"string","description":"Product name."},"description":{"type":"string","description":"What the product does."}},"required":["name","description"],"additionalProperties":false}}},"required":["slug","title","summary","html_url","api_url","detailed","eyebrow","intro","lead","services","how_we_help","impact","products"],"additionalProperties":false},"CapabilityList":{"type":"object","description":"Every capability idataraya publishes.","properties":{"self":{"type":"string","description":"This endpoint's own URL."},"count":{"type":"integer","description":"Number of items. The list is never paginated."},"items":{"type":"array","description":"Every item in the collection.","items":{"$ref":"#/components/schemas/SectionSummary"}}},"required":["self","count","items"],"additionalProperties":false},"IndustryList":{"type":"object","description":"Every sector idataraya publishes.","properties":{"self":{"type":"string","description":"This endpoint's own URL."},"count":{"type":"integer","description":"Number of items. The list is never paginated."},"items":{"type":"array","description":"Every item in the collection.","items":{"$ref":"#/components/schemas/SectionSummary"}}},"required":["self","count","items"],"additionalProperties":false},"InsightSummary":{"type":"object","description":"A published field note, without its body text.","properties":{"slug":{"type":"string","description":"URL-safe identifier."},"title":{"type":"string","description":"Headline."},"category":{"type":"string","description":"Subject area, e.g. \"Payments\"."},"summary":{"type":"string","description":"Standfirst: the argument of the piece in one or two sentences."},"date_published":{"type":"string","description":"Publication date as published, e.g. \"24 June 2026\". Not ISO 8601."},"reading_time":{"type":"string","description":"Estimated reading time as published, e.g. \"6 minute read\"."},"authors":{"type":"array","description":"Named authors, in byline order.","items":{"type":"string","description":"Author name."}},"html_url":{"type":"string","description":"The article page."},"api_url":{"type":"string","description":"The full text of this article as JSON."},"markdown_url":{"type":"string","description":"The same article as markdown. Also reachable by sending Accept: text/markdown to html_url."}},"required":["slug","title","category","summary","date_published","reading_time","authors","html_url","api_url","markdown_url"],"additionalProperties":false},"InsightDetail":{"type":"object","description":"A published field note including its full text.","properties":{"slug":{"type":"string","description":"URL-safe identifier."},"title":{"type":"string","description":"Headline."},"category":{"type":"string","description":"Subject area, e.g. \"Payments\"."},"summary":{"type":"string","description":"Standfirst: the argument of the piece in one or two sentences."},"date_published":{"type":"string","description":"Publication date as published, e.g. \"24 June 2026\". Not ISO 8601."},"reading_time":{"type":"string","description":"Estimated reading time as published, e.g. \"6 minute read\"."},"authors":{"type":"array","description":"Named authors, in byline order.","items":{"type":"string","description":"Author name."}},"html_url":{"type":"string","description":"The article page."},"api_url":{"type":"string","description":"The full text of this article as JSON."},"markdown_url":{"type":"string","description":"The same article as markdown. Also reachable by sending Accept: text/markdown to html_url."},"takeaways":{"description":"The summary a reader can act on without reading the piece. Null when the article has none.","oneOf":[{"type":"object","description":"Lead sentence and the points under it.","properties":{"intro":{"type":"string","description":"One sentence stating what the piece establishes."},"points":{"type":"array","description":"The takeaways, in order.","items":{"type":"string","description":"A single takeaway."}}},"required":["intro","points"],"additionalProperties":false},{"type":"null"}]},"blocks":{"type":"array","description":"The article body in reading order.","items":{"type":"object","description":"A run of body paragraphs, optionally under a heading.","properties":{"heading":{"type":["string","null"],"description":"Section heading, or null when the block continues the previous one."},"paragraphs":{"type":"array","description":"Paragraphs in reading order.","items":{"type":"string","description":"One paragraph of body text."}}},"required":["heading","paragraphs"],"additionalProperties":false}},"pull_quote":{"type":["string","null"],"description":"The single pulled quote, or null when the article has none."}},"required":["slug","title","category","summary","date_published","reading_time","authors","html_url","api_url","markdown_url","takeaways","blocks","pull_quote"],"additionalProperties":false},"InsightList":{"type":"object","description":"Every published field note.","properties":{"self":{"type":"string","description":"This endpoint's own URL."},"count":{"type":"integer","description":"Number of items. The list is never paginated."},"items":{"type":"array","description":"Every item in the collection.","items":{"$ref":"#/components/schemas/InsightSummary"}}},"required":["self","count","items"],"additionalProperties":false},"ClientImpactSummary":{"type":"object","description":"A named client engagement as it appears in a list response.","properties":{"slug":{"type":"string","description":"URL-safe identifier."},"title":{"type":"string","description":"Headline for the engagement."},"client":{"type":"string","description":"The organisation the work was done for."},"brand":{"type":"string","description":"The product or programme name the work is known by."},"summary":{"type":"string","description":"One-paragraph description of the engagement."},"headline_metric":{"type":"object","description":"A published figure and what it measures.","properties":{"value":{"type":"string","description":"The figure as published, e.g. \"Under a minute\"."},"caption":{"type":"string","description":"What the figure refers to."}},"required":["value","caption"],"additionalProperties":false},"html_url":{"type":"string","description":"The case study page."},"api_url":{"type":"string","description":"The full record for this engagement."}},"required":["slug","title","client","brand","summary","headline_metric","html_url","api_url"],"additionalProperties":false},"ClientImpactDetail":{"type":"object","description":"A named client engagement in full.","properties":{"slug":{"type":"string","description":"URL-safe identifier."},"title":{"type":"string","description":"Headline for the engagement."},"client":{"type":"string","description":"The organisation the work was done for."},"brand":{"type":"string","description":"The product or programme name the work is known by."},"summary":{"type":"string","description":"One-paragraph description of the engagement."},"headline_metric":{"type":"object","description":"A published figure and what it measures.","properties":{"value":{"type":"string","description":"The figure as published, e.g. \"Under a minute\"."},"caption":{"type":"string","description":"What the figure refers to."}},"required":["value","caption"],"additionalProperties":false},"html_url":{"type":"string","description":"The case study page."},"api_url":{"type":"string","description":"The full record for this engagement."},"lead":{"type":"string","description":"Opening description of the engagement."},"challenge":{"type":"string","description":"The problem the client had before the work started."},"built":{"type":"array","description":"What was built, one entry per component.","items":{"type":"object","description":"A titled block of prose.","properties":{"title":{"type":"string","description":"Heading for the block."},"body":{"type":"string","description":"The block's text, plain prose with no markup."}},"required":["title","body"],"additionalProperties":false}},"integrations":{"type":"array","description":"What the system was connected to, and why.","items":{"type":"object","description":"A titled block of prose.","properties":{"title":{"type":"string","description":"Heading for the block."},"body":{"type":"string","description":"The block's text, plain prose with no markup."}},"required":["title","body"],"additionalProperties":false}},"connects_to":{"type":"array","description":"Named parties and schemes the delivered system connects to.","items":{"type":"string","description":"Name of a party, scheme or service."}},"outcomes":{"type":"array","description":"Measured outcomes after the work.","items":{"type":"object","description":"A published figure and what it measures.","properties":{"value":{"type":"string","description":"The figure as published, e.g. \"Under a minute\"."},"caption":{"type":"string","description":"What the figure refers to."}},"required":["value","caption"],"additionalProperties":false}},"products":{"type":"array","description":"idataraya products the engagement was built on.","items":{"type":"object","description":"A named product the engagement or page involves.","properties":{"name":{"type":"string","description":"Product name."},"description":{"type":"string","description":"What the product does."}},"required":["name","description"],"additionalProperties":false}}},"required":["slug","title","client","brand","summary","headline_metric","html_url","api_url","lead","challenge","built","integrations","connects_to","outcomes","products"],"additionalProperties":false},"ClientImpactList":{"type":"object","description":"Every published client engagement.","properties":{"self":{"type":"string","description":"This endpoint's own URL."},"count":{"type":"integer","description":"Number of items. The list is never paginated."},"items":{"type":"array","description":"Every item in the collection.","items":{"$ref":"#/components/schemas/ClientImpactSummary"}}},"required":["self","count","items"],"additionalProperties":false},"Accepted":{"type":"object","description":"Confirmation that a message was accepted for delivery.","properties":{"ok":{"type":"boolean","description":"Always true. A failure returns an error instead."}},"required":["ok"],"additionalProperties":false},"Error":{"type":"object","description":"Every error from this API, in one shape. Errors are always JSON, never an HTML page.","properties":{"error":{"type":"string","description":"Short human-readable summary. Present for backwards compatibility."},"code":{"type":"string","description":"Stable machine-readable code. One of: not_found, method_not_allowed, invalid_request, invalid_json, mail_not_configured, upstream_failed."},"message":{"type":"string","description":"What went wrong, in a sentence."},"hint":{"type":"string","description":"What the caller should do about it."},"documentation_url":{"type":"string","description":"Where to read more."},"status":{"type":"integer","description":"The HTTP status code, repeated in the body."}},"required":["error","code","message","hint","documentation_url","status"],"additionalProperties":false},"ValidationError":{"type":"object","description":"An error naming the fields that were rejected.","properties":{"error":{"type":"string","description":"Short human-readable summary."},"code":{"type":"string","description":"Always \"invalid_request\"."},"message":{"type":"string","description":"What went wrong, in a sentence."},"hint":{"type":"string","description":"What the caller should do about it."},"documentation_url":{"type":"string","description":"Where to read more."},"status":{"type":"integer","description":"Always 400."},"invalid":{"type":"object","description":"One entry per rejected field, keyed by field name, with the reason as its value.","additionalProperties":{"type":"string"}}},"required":["error","code","message","hint","documentation_url","status","invalid"],"additionalProperties":false},"EnquiryRequest":{"type":"object","description":"An enquiry from a person who wants idataraya to get in touch.","properties":{"topic":{"type":"string","description":"What the enquiry is about. Must be one of the listed values exactly; anything else is rejected.","enum":["New or current client. I want to discuss a system to build, or one you would take over and run.","Existing client support. I need help with something you already run for us.","Partner or supplier. I want to talk about hardware, payment rails, or vendor work.","Media. I have a press or media question.","Something else. I need help with something not listed above."]},"name":{"type":"string","maxLength":200,"description":"The sender's full name."},"email":{"type":"string","format":"email","maxLength":320,"description":"A working address for the reply. This is where the answer goes."},"phone":{"type":"string","maxLength":60,"description":"Optional phone number."},"organisation":{"type":"string","maxLength":200,"description":"The organisation the sender is with."},"role":{"type":"string","maxLength":200,"description":"Optional job title."},"message":{"type":"string","minLength":20,"maxLength":20000,"description":"What the sender needs. At least 20 characters."}},"required":["topic","name","email","organisation","message"],"additionalProperties":false},"ApplicationRequest":{"type":"object","description":"A job application, optionally with a CV attached.","properties":{"name":{"type":"string","maxLength":200,"description":"The applicant's full name."},"email":{"type":"string","format":"email","maxLength":320,"description":"A working address for the reply."},"phone":{"type":"string","maxLength":60,"description":"Optional phone number."},"links":{"type":"string","maxLength":1000,"description":"Optional portfolio, GitHub or LinkedIn URLs, free text."},"role":{"type":"string","maxLength":200,"description":"The role applied for, as \"Title (REF)\". Omit for a speculative application."},"message":{"type":"string","minLength":20,"maxLength":20000,"description":"The covering note. At least 20 characters."},"cv":{"type":"object","description":"Optional CV attachment. PDF, DOC or DOCX, up to 5MB before encoding.","properties":{"name":{"type":"string","maxLength":260,"description":"File name, ending in .pdf, .doc or .docx."},"content":{"type":"string","contentEncoding":"base64","description":"File bytes, base64."}},"required":["name","content"],"additionalProperties":false}},"required":["name","email","message"],"additionalProperties":false}}},"x-agent":{"llms_txt":"https://idataraya.com/llms.txt","markdown_content_negotiation":{"description":"Every page on this site has a markdown representation. Send Accept: text/markdown, or append .md to the path. Responses carry Vary: Accept.","example":"https://idataraya.com/about.md"},"rate_limit":"None. Everything under /api/v1 is a static file served from a CDN. The two POST endpoints deliver email and should not be called in a loop."}}