# OwnLocal > OwnLocal is an Austin, Texas automated digital advertising platform for local media companies. It takes a > newspaper's print advertisement PDF and machine-converts it into a responsive digital ad unit, a local > business directory listing, and a search presence — extending the advertiser's reach across search, social > and display. Its partner-facing REST API (OwnLocal API v1) lets publishers create and manage ads and the > local businesses that place them, read OwnLocal's business category vocabulary, and pull campaign > performance reporting. GENERATED BY: API Evangelist enrichment pipeline, 2026-08-12. METHOD: generated. OwnLocal does not publish an llms.txt — /llms.txt returns 404 on ownlocal.com, admin.austin.ownlocal.com and api.docs.ownlocal.com. This file is assembled from OwnLocal's own published API reference and its live Swagger definition. Nothing here is invented. ## At a glance - API: OwnLocal API, version v1 - Base URL: https://admin.austin.ownlocal.com - Reference: https://api.docs.ownlocal.com/ (Slate) - Machine contract: https://admin.austin.ownlocal.com/api-docs/v1/swagger.json (Swagger 2.0, served live) - Swagger UI: https://admin.austin.ownlocal.com/api-docs - Auth: organization API key, sent RAW in the `Authorization` header with NO `Bearer` prefix - Key provisioning: manual — contact support@ownlocal.com. There is no self-serve developer signup. - Operations: 13 across 4 resources - Media types: application/json; multipart/form-data on the three uploads ## Authentication curl "https://admin.austin.ownlocal.com/api/v1/ads" -H "Authorization: " The key is organization-scoped. A `Bearer` prefix will fail — this is the most common integration mistake with this API. No OAuth 2.0, no OpenID Connect, no scopes. ## Operations ### Ads — print ads converted into digital ad units - `createAd` — POST /api/v1/ads — create an ad under a publisher; returns adUuid and a content_url - `listAds` — GET /api/v1/ads — filter by category, sub-category, offer count, start/end/created/modified date ranges, business ids, publisher ids; sortedBy, page, size (default 20) - `getAd` — GET /api/v1/ads/{adUuid} — one ad, with extracted text and machine-extracted offers - `updateAd` — PATCH /api/v1/ads/{adUuid} - `uploadAdContent` — POST /api/v1/ads/{adUuid}/content — multipart PDF upload; returns 202 ### Businesses — the local advertisers and their directory listings - `listBusinesses` — GET /api/v1/businesses — filter by category, date ranges, publisher ids; page, size (default 30) - `createBusiness` — POST /api/v1/businesses — name, publishers[], address, hours, categories, contact - `getBusiness` — GET /api/v1/businesses/{businessUuid} - `uploadBusinessLogo` — POST /api/v1/businesses/{businessUuid}/logo — returns 202 - `uploadBusinessImage` — POST /api/v1/businesses/{businessUuid}/images — returns 202 ### Categories — the classification vocabulary - `listCategories` — GET /api/v1/categories — top-level categories with an integer-id to name sub-category map; page, size (default 25) ### Reports — campaign performance - `getAdsReport` — GET /api/v1/reports/ads — per-publisher: impressions, interaction breakdown, leads, digital lift - `getBusinessReport` — GET /api/v1/reports/business — per-business: print reach, directory and Origami breakdowns, interactions, plus search keyword rank history and SERP context ## Data model Publisher (the local media company) is the tenancy root. An Ad belongs to one Publisher and one Business; a Business can be listed under many Publishers; Offers are embedded read-only inside an Ad. All identifiers are unprefixed UUIDs, except sub-categories which use small integer ids. IMPORTANT: Publisher has no schema and no endpoint. Every write and every report requires a publisherUuid and the API offers no way to discover one — it must be supplied out of band by OwnLocal. ## Things an agent must know before calling this API - NO IDEMPOTENCY. `createAd` and `createBusiness` have no idempotency key, and the API has no DELETE on any resource. A retry after a timeout creates a permanent duplicate. Use `adCustomId` / `custom_id` to reconcile, and check the list endpoints before retrying a create. - ASYNC WITH NO CALLBACK. The three upload operations return 202. There is no webhook, callback, or job-status resource. Poll `getAd` / `getBusiness` until derived fields populate. - RATE LIMITED, INVISIBLY. 429 is documented and enforced, but no numeric limit, window, `Retry-After`, or `RateLimit-*` header is published. Blind exponential backoff is the only strategy available. - ERRORS ARE STATUS-CODE ONLY. No RFC 9457 problem+json. The one typed error body is `unacceptableContent` (`{message}`) on the three uploads. 401, 403 and 429 appear in the reference's error table but are declared on no operation in the machine contract. - 405 MEANS "INVALID INPUT" on `createAd` and `createBusiness`, not "method not allowed". - LIST RESPONSES ARE BARE ARRAYS. No envelope, no total, no next link. You cannot tell you are on the last page except by receiving fewer than `size` records. Default page size differs per collection (20/30/25). - MIXED NAMING. Ads/Businesses/Categories use camelCase; Reports use snake_case. The prose reference and the machine contract disagree on the CRUD parameters — trust the Swagger definition. - SUB-CATEGORY ASYMMETRY. You write an integer id (`primary_sub_cat_id`) and read back a name string. - HOURS ENCODING. `hours_of_operation` uses 12-hour times ("08:00AM") and the STRINGS "1"/"0" for its flags. ## What OwnLocal does not publish No SDK or client library in any package registry. No CLI. No sandbox or test mode. No changelog. No webhooks or AsyncAPI. No MCP server, agent card, or ai-plugin manifest. No security.txt, OpenID configuration, or api-catalog. No pricing or plans page. No SLA or deprecation policy. No published certifications or trust center. ## Links - Website: https://ownlocal.com - API reference: https://api.docs.ownlocal.com/ - Swagger definition: https://admin.austin.ownlocal.com/api-docs/v1/swagger.json - Support: https://www.ownlocal.com/support/ — support@ownlocal.com - Status: https://status.ownlocal.com/ (static page; renders client-side, no machine-readable feed) - Privacy: https://www.ownlocal.com/privacy-policy/ — privacy@ownlocal.com - GitHub: https://github.com/OwnLocal ## This profile Independent third-party profile maintained by API Evangelist from OwnLocal's public surface. https://apievangelist.com — corrections, re-scores and removal are free: info@apievangelist.com