# Indonesia BPJPH Halal Certificate Search (`bareezh_codes/bpjph-halal-certificate-scraper`) Actor

Searches Indonesia's official BPJPH (halal.go.id) halal certification registry for products and businesses, returning certificate number, business name, product name, category and issue date. Built for compliance and sourcing teams racing to verify halal status before Indonesia's October 17, 2026...

- **URL**: https://apify.com/bareezh\_codes/bpjph-halal-certificate-scraper.md
- **Developed by:** [Salman Bareesh](https://apify.com/bareezh_codes) (community)
- **Categories:** Business, E-commerce
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Check any product or business against Indonesia's official **BPJPH halal certificate registry** (halal.go.id) — the government database that decides whether a product can legally carry a halal label in Indonesia. This actor reads BPJPH's public certificate search directly, returning certificate number, business name, product name, and issue date for each match, so trade-compliance, sourcing and export teams can verify halal status in bulk instead of querying the site by hand.

### Why use this actor now?

Indonesia's mandatory halal certification requirement (Law 33/2014, extended by PP 42/2024) reaches full enforcement on **October 17, 2026** — after that date, most food, beverage and cosmetic products sold in Indonesia (population 280M+, the world's largest Muslim-majority market) must carry a valid BPJPH halal certificate or be pulled from shelves. That deadline is creating urgent, one-off and recurring demand for bulk certificate verification:

- **Export/import compliance** — confirm a supplier's or your own product's halal status before shipping into or listing in Indonesia.
- **Sourcing & procurement** — screen a shortlist of Indonesian manufacturers by certificate status before signing a contract.
- **Marketplace & retail trust** — verify that a seller's halal badge claim matches an active BPJPH certificate.
- **Certification consultants/auditors** — track certificates issued to client businesses.

### What data can this actor extract?

| Field | Type | Description |
|---|---|---|
| `productName` | string | Certified product name |
| `businessName` | string | Business (pelaku usaha) the certificate was issued to |
| `certificateNumber` | string | BPJPH halal certificate number |
| `registrationNumber` | string, null | Business's NIB (Nomor Induk Berusaha) registration number, when published |
| `issueDate` | string | Certificate issue date, as published (Indonesian format, e.g. "16 September 2026") |
| `halalCategory` | string, null | Product/service category, when BPJPH publishes one for that certificate |
| `status` | string | Certificate status (`"Issued"` for every record returned — this registry only lists issued certificates) |
| `sourceUrl` | string | The exact BPJPH registry page this record was read from |

### How to use this actor

1. Click **Try for free** (or **Run**) on this actor's page.
2. Leave **Search query** empty to browse the most recently issued certificates, or fill it in with a product name, business name, or certificate number.
3. Set **Search by** to match what you put in the query (`Product name`, `Business name`, or `Certificate number`).
4. Set **Max results** to cap how many certificates you want back.
5. Click **Start** and wait for the run to finish.
6. Open the **Dataset** tab and export as JSON, CSV, or Excel — or pull results programmatically via the **API** tab.

#### Input example

Find certificates for businesses with "USIN" in their name:

```json
{
  "searchQuery": "USIN",
  "searchBy": "business",
  "maxResults": 50
}
```

### Output example

This is a real item from a live run of this actor (`tests/smoke_input.json`, empty query — browsing the most recent certificates):

```json
{
  "productName": "KERIPIK KACA RASA PEDAS TEH ENYI",
  "businessName": "USIN",
  "certificateNumber": "ID32110080916300926",
  "registrationNumber": null,
  "issueDate": "16 September 2026",
  "halalCategory": null,
  "status": "Issued",
  "sourceUrl": "https://bpjph.halal.go.id/cari/sertifikat?page=1"
}
```

### Pricing

You pay **$0.008 per result** — no subscription, and nothing is charged for a run that finds no matches.

| Your Apify discount tier | Price per result |
|---|---|
| Free | $0.008 |
| Bronze | $0.0072 |
| Silver | $0.0065 |
| Gold | $0.006 |
| Platinum / Diamond | $0.0055 |

Apify's free plan includes $5 of monthly credit — enough for 600+ certificate lookups at no cost.

### FAQ

**Is this legal?** Yes. BPJPH's certificate registry is a public Indonesian government service published at [bpjph.halal.go.id](https://bpjph.halal.go.id) for anyone to search. This actor reads the same public pages a person browsing the site would see — no login, no CAPTCHA bypass, no personal data.

**Why does "Product name" or "Certificate number" search sometimes return fewer results than "Max results"?** BPJPH's own search form accepts a product-name or certificate-number filter, but (verified while building this actor) it does not actually filter server-side — the registry returns the same unfiltered, most-recent-first listing regardless of that value. To work around this, this actor scans the most recently issued certificates locally and keeps only the ones matching your query, up to 600 recent certificates (60 pages) per run. If your product or certificate isn't among the most recent listings, it won't be found this way — use **Business name** search instead, which BPJPH does filter server-side and is both faster and more complete.

**Why is `halalCategory` often `null`?** BPJPH's registry currently leaves the product/service category field unpublished ("-") for the vast majority of certificates in this listing; the field is included and populated whenever the source does provide a value.

**How fresh is the data?** As fresh as BPJPH's own registry — this actor reads the live search page on every run, so results reflect whatever BPJPH has published at run time.

### Limits & notes

- Only certificates published in BPJPH's public search registry are covered — draft, rejected, or revoked applications are not listed there and so cannot appear in results.
- BPJPH is a Next.js government application with no official public API; this actor reads the same server-rendered HTML a browser receives and has no documented stability guarantee from BPJPH. If BPJPH changes its page structure, this actor may need an update — please report issues via the **Issues** tab.
- Field labels and some content in the source registry are in Indonesian (e.g. dates like "16 September 2026" are day-month-year with an Indonesian month name).
- This actor identifies itself with a descriptive `User-Agent` and paces requests modestly to stay respectful of BPJPH's public infrastructure, especially given expected traffic spikes as the October 17, 2026 enforcement deadline approaches.

#### Support

Found a bug or have a feature request? Use the **Issues** tab on this actor's page. For programmatic access, see the **API** tab for ready-made code snippets in your language of choice.

# Actor input Schema

## `searchQuery` (type: `string`):

Product name, business name, or certificate number keyword to search for (matched against the field chosen in 'Search by'). Leave empty to browse the most recently issued certificates.

## `searchBy` (type: `string`):

Which field 'Search query' matches. 'Business name' is filtered directly by BPJPH's registry (fast, case-insensitive substring match). 'Product name' and 'Certificate number' are matched locally against BPJPH's most recently issued certificates, since BPJPH's own product-name and certificate-number search filters do not filter server-side (verified while building this actor) — a query that isn't among the most recent certificates may return zero results.

## `maxResults` (type: `integer`):

Maximum number of certificates to return.

## Actor input object example

```json
{
  "searchQuery": "",
  "searchBy": "product",
  "maxResults": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

One item per matching halal certificate

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("bareezh_codes/bpjph-halal-certificate-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("bareezh_codes/bpjph-halal-certificate-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call bareezh_codes/bpjph-halal-certificate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bareezh_codes/bpjph-halal-certificate-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/p5sde9xr0s0VYZuKM/builds/UfCSpthJ678FBrqQG/openapi.json
