{"openapi": "3.1.0", "info": {"title": "AmarktAI Earn Commercial API", "version": "1.0.0", "description": "Profit-aware commercial API products. Every output follows canonical execution and independent QA; settlement remains separate."}, "servers": [{"url": "https://earn.amarktai.co.za"}], "paths": {"/api/v1/requests/{request_id}": {"get": {"summary": "Get request status", "security": [{"BearerAPIKey": []}], "parameters": [{"name": "request_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Canonical request state"}, "401": {"$ref": "#/components/responses/AuthenticationError"}}}}, "/api/v1/requests/{request_id}/result": {"get": {"summary": "Get a QA-approved result", "security": [{"BearerAPIKey": []}], "parameters": [{"name": "request_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "QA-approved result"}, "409": {"description": "Result is not complete"}}}}, "/api/v1/products/data-cleanup/jobs": {"post": {"summary": "Data Cleanup API", "description": "Normalize headers and values, deduplicate rows, convert formats, map columns, or validate a schema.", "security": [{"BearerAPIKey": []}, {"RapidAPIProxy": []}], "parameters": [{"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "maxLength": 180}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["rows"], "properties": {"rows": {"type": "array", "maxItems": 5000}, "action": {"enum": ["normalize", "deduplicate", "convert", "column_map", "validate"]}, "schema": {"type": "object"}, "column_mapping": {"type": "object"}}}, "example": {"rows": [{"Team": "Ops", " Name ": " Ada "}], "action": "normalize"}}}}, "responses": {"200": {"description": "Synchronous QA-approved result"}, "202": {"description": "Accepted asynchronous job"}, "400": {"description": "Structured request error"}, "401": {"$ref": "#/components/responses/AuthenticationError"}, "409": {"description": "Idempotency conflict"}, "429": {"description": "Rate or quota limit"}}}}, "/api/v1/products/document-text/jobs": {"post": {"summary": "Document Text API", "description": "Extract text locally from supported documents and route OCR only when the source requires it.", "security": [{"BearerAPIKey": []}, {"RapidAPIProxy": []}], "parameters": [{"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "maxLength": 180}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["content_base64", "filename"], "properties": {"ocr": {"type": "boolean"}, "filename": {"type": "string"}, "content_base64": {"type": "string"}}}, "example": {"filename": "brief.pdf", "content_base64": "<base64>"}}}}, "responses": {"200": {"description": "Synchronous QA-approved result"}, "202": {"description": "Accepted asynchronous job"}, "400": {"description": "Structured request error"}, "401": {"$ref": "#/components/responses/AuthenticationError"}, "409": {"description": "Idempotency conflict"}, "429": {"description": "Rate or quota limit"}}}}, "/api/v1/products/media-utility/jobs": {"post": {"summary": "Media Utility API", "description": "Run deterministic media utilities with decoded-size checks and QA before a result is released.", "security": [{"BearerAPIKey": []}, {"RapidAPIProxy": []}], "parameters": [{"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "maxLength": 180}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["content_base64", "filename", "width", "height"], "properties": {"width": {"type": "integer", "maximum": 10000, "minimum": 1}, "height": {"type": "integer", "maximum": 10000, "minimum": 1}, "filename": {"type": "string"}, "output_format": {"enum": ["PNG", "JPEG", "WEBP"]}, "content_base64": {"type": "string"}}}, "example": {"width": 800, "height": 800, "filename": "product.png", "output_format": "WEBP", "content_base64": "<base64>"}}}}, "responses": {"200": {"description": "Synchronous QA-approved result"}, "202": {"description": "Accepted asynchronous job"}, "400": {"description": "Structured request error"}, "401": {"$ref": "#/components/responses/AuthenticationError"}, "409": {"description": "Idempotency conflict"}, "429": {"description": "Rate or quota limit"}}}}, "/api/v1/products/public-web-extraction/jobs": {"post": {"summary": "Public Web Extraction API", "description": "Extract allowed public page data with policy proof; heavy interactive browsing stays off-host through Apify.", "security": [{"BearerAPIKey": []}, {"RapidAPIProxy": []}], "parameters": [{"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "maxLength": 180}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["url", "purpose", "authorization_confirmed", "terms_permit"], "properties": {"url": {"type": "string", "format": "uri"}, "purpose": {"type": "string"}, "terms_permit": {"const": true}, "authorization_confirmed": {"const": true}}}, "example": {"url": "https://example.com", "purpose": "authorized product catalogue monitoring", "terms_permit": true, "authorization_confirmed": true}}}}, "responses": {"200": {"description": "Synchronous QA-approved result"}, "202": {"description": "Accepted asynchronous job"}, "400": {"description": "Structured request error"}, "401": {"$ref": "#/components/responses/AuthenticationError"}, "409": {"description": "Idempotency conflict"}, "429": {"description": "Rate or quota limit"}}}}, "/api/v1/products/structured-extraction/jobs": {"post": {"summary": "Structured Extraction API", "description": "Extract schema-bound facts from supplied text without returning unvalidated free-form output.", "security": [{"BearerAPIKey": []}, {"RapidAPIProxy": []}], "parameters": [{"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "maxLength": 180}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["content", "schema"], "properties": {"schema": {"type": "object"}, "content": {"type": "string", "maxLength": 100000}}}, "example": {"schema": {"total": "number", "invoice": "string"}, "content": "Invoice 104 totals USD 42.00"}}}}, "responses": {"200": {"description": "Synchronous QA-approved result"}, "202": {"description": "Accepted asynchronous job"}, "400": {"description": "Structured request error"}, "401": {"$ref": "#/components/responses/AuthenticationError"}, "409": {"description": "Idempotency conflict"}, "429": {"description": "Rate or quota limit"}}}}}, "components": {"securitySchemes": {"BearerAPIKey": {"type": "http", "scheme": "bearer", "bearerFormat": "ak_prefix.secret"}, "RapidAPIProxy": {"type": "apiKey", "in": "header", "name": "X-RapidAPI-Proxy-Secret"}}, "responses": {"AuthenticationError": {"description": "Authentication failed", "content": {"application/json": {"schema": {"type": "object", "required": ["error", "request_id"], "properties": {"error": {"type": "object", "required": ["code", "message"]}, "request_id": {"type": "string"}}}}}}}}, "x-amarktai": {"idempotency_required": true, "quota_metering": "successful request exactly once", "async_lifecycle": ["ADMITTED", "QUEUED", "EXECUTING", "QA_PASSED", "COMPLETED"], "support": "/api/docs/#support", "settlement_truth": "API usage is not settled revenue"}}