Dish Directory Admin API
The Admin API from Dish Directory — 138 operation(s) for admin.
Operations 207
POST
/admin/voice/preview
Preview a fixed spoken line with the selected voice. Session admin only.
#
POST
/admin/agent-runs
Record one agent run: agent, command, input, status, output link, error and…
#
PATCH
/admin/agent-runs/{id}
Finish a running agent run with its outcome: succeeded, failed or cancelled…
#
GET
/admin/billing/subscriptions
The subscriptions of this site, newest first, with the failed-payment state…
#
PATCH
/admin/billing/subscriptions/{id}
Cancel one subscription of this site at Stripe, now or at the end of the paid…
#
POST
/admin/billing/invoices/{id}/refund
Refund the payment of one subscription invoice of this site, in part or in full.
#
POST
/admin/billing/retry
Retry the failed renewal of a past_due subscription: pay its newest open…
#
POST
/admin/listings/{id}/owner
Assign the owner of a listing by admin fiat: a verified manual claim, no email…
#
DELETE
/admin/listings/{id}/owner
Revoke the owner of a listing: its verified claim expires and claimed_by clears.
#
GET
/admin/enrichment/requests
The enrichment requests of the site, newest first, filtered by status.
#
PATCH
/admin/enrichment/requests/{id}
Move one enrichment request on: open to running, then running to done (with…
#
POST
/admin/ads/campaigns/{id}/status
Pause or resume one campaign through the ads relay. Audited.
#
GET
/admin/mail/recent
The latest received mail, newest first, with the verification links and codes…
#
POST
/admin/support/refund
Refund the payment of one subscription invoice of this site for a support…
#
POST
/admin/support/takedown
Record a takedown request and hand it to a human: the named ticket is escalated…
#
POST
/admin/support/legal
Record a legal request and hand it to a human: the named ticket is escalated…
#
PATCH
/admin/support/tickets/{id}
Change one support ticket status (open, pending, resolved). Audited.
#
POST
/admin/support/tickets/{id}/reply
Answer the sender of one support ticket by mail, on the ticket thread, with…
#
GET
/admin/mail/{messageId}/attachments/{attachmentId}
Download one attachment of a stored message
#
GET
/admin/monitoring/sites
The site rollup: identity, the newest event of each kind and the open-alert…
#
POST
/admin/domains/{domain}/verify
Re-read the Cloudflare state and cross-check it against a public resolver, one…
#
POST
/admin/leads/dispatch
Start one parallel call run. Needs the leads:write scope or an admin session
#
POST
/admin/leads/drips
Create, update or delete a drip sequence: a name plus ordered steps (template…
#
POST
/admin/leads/{id}
Set lead status, request a call, set the script, send a text or a postcard…
#
POST
/admin/leads/templates
Create, update or delete a message template (text, call or postcard body with…
#
GET
/admin/link-exchanges
The link exchanges, newest first: the site, the contact, the placement, the…
#
GET
/admin/link-exchanges/{id}
Read one link exchange whole: the site, the contact, the last live-link check…
#
GET
/admin/listings
List listings of every status (draft, pending, published, archived), ordered by…
#
PATCH
/admin/listings/{slug}
Change some fields of one listing, by id or slug: editable import fields…
#
POST
/admin/listings/bulk
Validate up to 100 listing rows and return the plan with field diffs (dryRun…
#
POST
/admin/listings/{slug}/photos
Add an upload to a listing: a multipart body with a file field (and alt), or…
#
GET
/admin/listings/{slug}/reviews
The on-site reviews of one listing, newest first, every status, with the…
#
GET
/admin/listings/{slug}/reviews/{rowId}
Read one on-site review of a listing, with the listing's rating aggregate.
#
PATCH
/admin/listings/{slug}/reviews/{rowId}
Edit the author name, rating or body of one on-site review.
#
POST
/admin/listings/{slug}/reviews/{rowId}/publish
Publish one on-site review: it counts in the listing's rating aggregate at once.
#
POST
/admin/listings/{slug}/reviews/{rowId}/reject
Reject one on-site review: it leaves the listing's rating aggregate at once.
#
GET
/admin/listings/{slug}/source-photos
List source photos in display order, including hidden rows.
#
PATCH
/admin/listings/{slug}/source-photos
Reorder all source photos, including hidden rows. Name every id exactly once.
#
GET
/admin/listings/{slug}/source-photos/{rowId}
Read one source photo on this listing. Needs content:read or an admin session
#
PATCH
/admin/listings/{slug}/source-photos/{rowId}
Edit source photo alt text. Dry run by default; set dryRun false to apply.
#
DELETE
/admin/listings/{slug}/source-photos/{rowId}
Suppress a source photo and retain its identity. Dry run by default.
#
GET
/admin/listings/{slug}/source-reviews
All copied platform reviews of one listing, hidden ones too.
#
POST
/admin/listings/{slug}/source-reviews
Add one platform review to a listing. Dry run unless confirm=true.
#
PATCH
/admin/listings/{slug}/source-reviews/{rowId}
Edit or hide one review. Dry run unless confirm=true.
#
DELETE
/admin/listings/{slug}/source-reviews/{rowId}
Remove one review from public pages. Dry run unless confirm=true.
#
GET
/admin/listings/{slug}/source-ratings
All copied platform ratings of one listing, hidden ones too.
#
POST
/admin/listings/{slug}/source-ratings
Add one platform rating to a listing. Dry run unless confirm=true.
#
PATCH
/admin/listings/{slug}/source-ratings/{rowId}
Edit or hide one rating. Dry run unless confirm=true.
#
DELETE
/admin/listings/{slug}/source-ratings/{rowId}
Remove one rating from public pages. Dry run unless confirm=true.
#
GET
/admin/redirects
The retired listing slugs (listing_redirects), newest first, with the listing…
#
POST
/admin/redirects
Reserve one retired slug for a listing: the old permalink, the old listing URL…
#
GET
/admin/moderation/queue
Every pending submission, edit suggestion, manual claim, open report and…
#
DELETE
/admin/moderation/ban
Lift one ban by its id. Needs the submissions:review scope or an admin session
#
GET
/admin/newsletter/api-keys
The newsletter API keys. Needs the newsletter:write scope or an admin session
#
POST
/admin/newsletter/contacts
Add, change or remove one subscriber, mail the confirmation to selected pending…
#
POST
/admin/newsletter/campaigns
Create a campaign draft. Needs the newsletter:write scope or an admin session
#
GET
/admin/newsletter/campaigns/{id}
One campaign with its body. Needs the newsletter:write scope or an admin session
#
DELETE
/admin/newsletter/campaigns/{id}
Delete a campaign. Needs the newsletter:write scope or an admin session
#
GET
/admin/reports/leads
Lead counts by status and cost per lead by channel (call, text, postcard) and…
#
GET
/admin/reports/revenue
Gross, refunded and net revenue per currency for a period, from Stripe events…
#
GET
/admin/reports/traffic
Search Console clicks, impressions, CTR and position for a period, with the top…
#
GET
/admin/seo/audit
The index audit of the site (robots, sitemap, sample pages) plus the sitemap…
#
POST
/admin/seo/resubmit-sitemap
Submit the sitemap to IndexNow and add it to Search Console. Audited.
#
POST
/admin/revalidate
Expire the cached public reads (listings, sources) so the next read sees a…
#
POST
/admin/outreach/reconcile
Read the mail inbox for replies and bounces that name a sent outreach message.
#
PUT
/admin/outreach/sender
Set the outreach sender: name, mailbox, postal address, DKIM selector, warm-up…
#
POST
/admin/outreach/suppressions
Add or lift one outreach suppression. An add closes the targets it covers.
#
GET
/admin/outreach/campaigns
Outreach campaigns over the CRM, newest first, 50 a page (limit up to 100).
#
POST
/admin/outreach/campaigns
Create one draft outreach campaign: a name, a channel (call, email, text or…
#
GET
/admin/outreach/contacts
The CRM contacts a campaign could reach on one channel, 50 a page, oldest first…
#
POST
/admin/outreach/targets/{id}
Pause, resume, mark replied or complained, draft the one follow-up, or set the…
#
POST
/admin/products
Create or replace one product by slug: an idempotent upsert that also restores…
#
POST
/admin/products/bulk
Upsert up to 200 products by slug from a JSON array, { rows }, or a text/csv…
#
PATCH
/admin/products/{slug}
Change some fields of one product. The result must pass the full product checks.
#
POST
/admin/product-categories
Create or replace one product category by slug: an idempotent upsert that also…
#
POST
/admin/product-categories/bulk
Upsert up to 200 product categories by slug from a JSON array, { rows }, or a…
#
GET
/admin/academy/templates/{slug}
One certificate template. Needs the academy:read scope or an admin session
#
PUT
/admin/academy/templates/{slug}
Create or replace one certificate template by slug: an idempotent upsert that…
#
GET
/admin/academy/courses/{slug}/lessons/{lesson}
One lesson of a course. Needs the academy:read scope or an admin session
#
PUT
/admin/academy/courses/{slug}/lessons/{lesson}
Create or replace one lesson by slug: an idempotent upsert.
#
DELETE
/admin/academy/courses/{slug}/lessons/{lesson}
Hard-delete one lesson. Its questions stay and lose their lesson.
#
GET
/admin/academy/courses/{slug}/images
The images of a course, oldest first, with the site path of each.
#
GET
/admin/academy/courses/{slug}/questions
The questions of a course, oldest first, with the correct flag of each option.
#
POST
/admin/academy/courses/{slug}/questions
Create one exam question; the answer carries its qst_ id.
#
GET
/admin/academy/courses/{slug}/questions/{id}
One question by qst_ id, with the correct flag of each option.
#
PUT
/admin/academy/courses/{slug}/questions/{id}
Replace one question by qst_ id; the same checks as create.
#
GET
/admin/academy/courses
Courses by sort order, with lesson and question counts, all and published.
#
GET
/admin/academy/students
Users with an enrollment, a certificate or a membership, the most recently…
#
GET
/admin/academy/students/{userId}
One student with enrollments, attempt scores and pass flags (never answers)…
#
DELETE
/admin/academy/memberships/{id}
Revoke a comp membership: the row stays as history and access ends now.
#
GET
/admin/academy/certificates/{code}
One certificate by code, in any spelling: upper or lower case, with or without…
#
POST
/admin/academy/certificates/{code}/revoke
Revoke one certificate with a reason of 3 to 300 characters.
#
POST
/admin/academy/certificates/{code}/reinstate
Clear the revoke of one certificate; it reads valid or expired again by its…
#
POST
/admin/academy/certificates/{code}/extend
Set a later expiry (an ISO date in the future, after the current one) or…
#
GET
/admin/users/{id}/sessions
The live sessions of one account, newest first: id, dates, address and user…
#
DELETE
/admin/voice
Remove the stored voice-agent settings so the site config defaults apply again.
#
Specifications
Schemas & Data
📊
JSONSchema
https://artifacts.apis.io/dishdirectory-com/json-schema/dishdirectory-com-listing-schema.json
📊
JSONSchema
https://artifacts.apis.io/dishdirectory-com/json-schema/dishdirectory-com-course-detail-schema.json
📊
JSONSchema
https://artifacts.apis.io/dishdirectory-com/json-schema/dishdirectory-com-product-schema.json
📊
JSONSchema
https://artifacts.apis.io/dishdirectory-com/json-schema/dishdirectory-com-course-schema.json
📊
JSONSchema
https://artifacts.apis.io/dishdirectory-com/json-schema/dishdirectory-com-listing-item-schema.json
📊
JSONSchema
https://artifacts.apis.io/dishdirectory-com/json-schema/dishdirectory-com-certificate-schema.json